onUpdate Snippet – spuštění document.ready fce
- maarlin
- Člen | 207
Řeším následující problém:
Mám web zAjaxovatělý a teď bohužel postupně zjišťuji, že mnoho věcí,
které byl JavaScript
- byl v hlavičkách a spouštěl se při
$(document).ready()
- byl inline přímo v konkrétních šablonách a řešil práci s formuláři v té šabloně (předvyplňování)
Chápu, že asi při updatu toho hlavního snippetu, tedy prakticky podobné
akce, jako při přechodu na jinou stránku je nutné ještě explicitně
zavolat tyhle funkce.
Bohužel se mi moc nedaří odhadnout, kde přesně bych je měl zavolat, aby
už byly všechny snippety updatované… zkouším extendnout
jquery.nette takto:
$.extend(true, $.nette, {
success: function(payload) {
// redirect
if (payload.redirect) {
window.location.href = payload.redirect;
return;
}
// state
if (payload.state) {
$.nette.state = payload.state;
}
// snippets
if (payload.snippets) {
for (var i in payload.snippets) {
$.nette.updateSnippet(i, payload.snippets[i]);
}
}
documentReady();
}
});
Což skutečně správně způsobí spuštění té fce, ale v podstatě
ještě před updatem snippetů, čili pokud tam hodím třeba alert, nejdříve
vyskočí alert a pak se donačtou snippety…
Kdy, resp. kde bych tyto fce měl správně volat?
- Ondřej Mirtes
- Člen | 1536
To nemá s Nette nic společného, to je klasický neduh Javacriptu/prohlížečů. Věci, které voláš v $(document).ready() se „bindnou“ k DOM elementům v době načtení stránky, po AJAXovém requestu se ti načtou nové elementy, které ty záležitosti bindnuté nemají. Volat znova $(document).ready() může být nešťastné, protože se tam ty definované věci provedou 2× a to může vést k nečekanému chování.
Částečným řešením je metoda jQuery.live(), která ti umožňuje bindnout některé události tak, že zůstanou funkční i po AJAXovém „reloadu“ prvků.
- Honza Kuchař
- Člen | 1662
Ale metoda .live() nefunguje se všemi událostmi → dá se používat .livequery, které funguje jaksi komplet.
- maarlin
- Člen | 207
honzakuchar napsal(a):
Ale metoda .live() nefunguje se všemi událostmi → dá se používat .livequery, které funguje jaksi komplet.
Díky za dobrý tip, přišel jsem na to, jak navázat klasické události, jako např. click, ovšem jak přes livequery navázat ready událost na objektu document, mi zcela není bohužel jasné…
Zkouším to takto:
$(document).livequery('ready', function(event) {
documentReady();
alert(1);
});
A ta událost evidentně nikdy nenastane – nespustí se
documentReady();
.
Dle JS konzole ve Firefoxu tam není žádný error, jen mraky warningů ze
samotné knihovny jQuery…
Jde mi o to, že plním HTML do jednoho spanu při
$(document).ready();
jeden odkaz, což správně má způsobit, že
se ten odkaz neobjeví při vypnutém nebo nedostupném JS.
- Ondřej Mirtes
- Člen | 1536
Ne, tos pochopil špatně. Neměls využít live, resp. livequery k tomu, abys spouštěl ready() metodu při updatu snippetů. Měls to využít k tomu, abys ty věci, které v ready() provádíš, přepsal do volání live() metod :)
- maarlin
- Člen | 207
Ondřej Mirtes napsal(a):
Ne, tos pochopil špatně. Neměls využít live, resp. livequery k tomu, abys spouštěl ready() metodu při updatu snippetů. Měls to využít k tomu, abys ty věci, které v ready() provádíš, přepsal do volání live() metod :)
V té ready metodě mám prakticky plnění daty – HTML:
$(document).ready(function() {
$('span.text').html('Javascript zapnutý');
});
Jak bych toto přepsal do live/livequery metody?
Tedy zjednodušeně řečeno, jak bych docílil toho, že se „Javascript
zapnutý“ zapíše do „span.text“ po refreshi jednoho konkrétního
snippetu?
Asi je možné odchytit si jméno toho snippetu a podle toho pustit nějakou akci:
$.extend(true, $.nette, {
updateSnippet: function (id, html) {
if (id == 'snippet--updateJs') {
ovšem už nevím jak… :(
Editoval maarlin (13. 3. 2010 14:11)