Nějaké obecné řešení práce s Javascriptem
- Ani
- Člen | 226
Ahoj,
zajímalo by mě jak řešíte javascritp (ruzné drobné funkce, obarvení textu, moseover, skrývání bloku). Píšete to do nějakého {block #js}. Nebo vše do externího souboru a inicializace přes document.ready nebo nějakou inicializační funkcí?
A co komponenty. Předáváte jim nějakou služby, kde se registrují a JS vypíšete na konec souboru?
Editoval Ani (8. 1. 2012 16:20)
- Werkov
- Člen | 17
Já jsem skončil (a začal) u bloků, které přes dědičnost rozšiřuji. Uvažoval jsem i o WebLoaderu, ale byl problém s dynamickým přidáváním JS z komponent, kvůli lazy vytváření. On by to zase nakonec takový problém nebyl, kdyby se jednalo jenom o JS a jeho načtení by se dalo vložit až na konec stránky, ale chtěl jsem to použít i pro CSS. (Další řešení je otouchovat všechny dotyčné komponenty předem, ale tak můžeš zbytečně vytvořit nepotřebnou komponentu a je s tím práce navíc.)
Různé pokusy o řešení pomocí šablonových maker už najdeš ve fóru.
IMO by řešením mohlo být zavedení „životního cyklu“ i komponenty, některé její úkony je zkrátka nutno provést ještě předtím, než je ve stránce kreslena.
- Ani
- Člen | 226
Řekl bych že LookoutControl tohle neřeší, když se ti komponenta vykresluje inicializuje, při volání přes makro control je už pozdě kreslit něco do hlavičky.
Dá se to částečně řešit vlastním filtrem, který vyzobe ze šablony všechny controly a předčasně je inicializuje, zavolá v nich nějakou metodu která to zapojí, ale není to zrovna ideální řešení…
- srigi
- Nette Blogger | 558
Ja to momentalne riesim prasacky – includnem do hlavicky jQuery aj jQUI a v sablonach Viewov/komponentov pisem surovo
<script>
$(function(){
// code here
});
</script>
Od toho ta dom.ready funkcia je – pockat na zostavenie DOM. Zatial je to prekvapivo funkcne, ale systemovost a spravovatelnost kodu sa mi nepaci.
Radsej by som JS presunul dole pred koncovu znacku </body> a nejako v sablone iba managoval include custom CSS/JS suboru pre dany View a komponentu. Je ale napikacu, ze z tych komponent nejde prebublat/extendnut blok, potom by to bolo uplne „maňifik“.
- petr.pavel
- Člen | 535
Já to řeším několika js soubory, které includuji vždy, abych využil cache prohlížeče. Kód v nich je napsaný tak, aby nespadl, když zrovna stránka tenhle js nepotřebuje.
Jestli těch samostatných částí máte fakt hodně, vyzkoušejte novou podporu Nette pro .combined.js a .combined.css, abyste ušetřili čas na jednotlivé požadavky na server.
Jasně, stahuje se kód, který třeba většinou potřeba není. Zatím u mě ale vždy převážila výhoda použití cache.
- Werkov
- Člen | 17
petr.pavel napsal(a):
Já to řeším několika js soubory, které includuji vždy, abych využil cache prohlížeče. Kód v nich je napsaný tak, aby nespadl, když zrovna stránka tenhle js nepotřebuje.
Jistě pro cacheování je výhodnější (ač se později nacahuje i samostatný soubor JS/CSS komponent), ale neřeší to ten problém, že musíš pamatovat na všechny komponenty, které máš v aplikaci použité a explicitně je uvádět do toho (globálního JS)/(skupiny JS).
- Nox
- Člen | 378
Řešil bych to podobně jako Srigi, akorát bych to nedal přímo do jQuery.ready ale do nějakého registru který si pak zpracuji, nejspíš taky v tom jQuery.ready někde dole, bude nad tím asi o píď lepší kontrola
Na druhé straně to spoléhá na existenci toho kontejneru nebo nějaké konvence … tamto spoléhá na jQuery, ale to je jaksi rozšířenější. Dokonalé řešení mě zatím nenapadá
- newPOPE
- Člen | 648
Na tieto veci uz su riesenia nie? Load kniznic az ked su potrebne (netusim ako sa to vola)…
V sucastnosti som v stave kde sa vyhybam tomu co popisuje srigi (pred tym som to tak robil = nulova znovupouzitelnost) a riesim to nasledovne:
- subor s definiciami xyz.js kde pisem nieco ako
<script>
var foo = {
init: function() {...}
}
</script>
a potom uz len podla class alebo priamo v sablone zavesim na dany prvok
- dalsia cesta je u mna priame rozsirovanie jQuery
<script>
jQuery.fn.foo = function(options) {...}
</script>
nejake setup veci su potom napr priamo v HTML tagu, nieco ako Nette Forms a validacne pravidla.
No ktovie kde budem za 2 tyzdne ;-)
EDIT: este ma napadlo, videl som riesenie ‚ala‘ google
<script>
register.load('mojCoolJavascriptPreKomponentu.js');
</script>
ktory zrejme funguje na document.write (.append(..)) alebo nieco podobne
Editoval newPOPE (9. 1. 2012 14:35)
- Ani
- Člen | 226
Díky za reakce snažím se tu vymyslet nějaké praktické řešení, které by sesunulo všechen JS nakonec souboru, pokuď možno odstranilo duplicity, fungovalo to v komponentách a dalo se to psát přímo v šablonách) myslím že se mi to i částečně daří, až bude tak ho zveřejním.
Jen by mě ještě zajímalo jak řešíte třeba formulářové prvky, který mají JS? Tam to nejde napsat do šablony, když ji nemají, injectovat do nich nějaký loader také moc nejde. Probublat do presenteru je docela problém, když je ten prvek v xy kontejnerech. Máte ty prvky, tak že si registrujé svůj JS třeba výpisem v getControl()?
newPOPE Podobně snad funguje head.js https://forum.nette.org/…i-z-controlu
Editoval Ani (10. 1. 2012 2:31)