onUpdate Snippet – spuštění document.ready fce

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
maarlin
Člen | 207
+
0
-

Ř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

  1. byl v hlavičkách a spouštěl se při $(document).ready()
  2. 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
+
0
-

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
+
0
-

Ale metoda .live() nefunguje se všemi událostmi → dá se používat .livequery, které funguje jaksi komplet.

maarlin
Člen | 207
+
0
-

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
+
0
-

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
+
0
-

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)