Po invalidaci formulare se vytrati vsechny javascripty
- Patrik Votoček
- Člen | 2221
Předpokládám že se tak neděje po invalidaci ale při ajaxovém překreslení snippetu. A je to proto protože je měněna DOM struktura na kterou jsou navázány události. Tj. musíš znovu inicializovat ony události aby se znova napojili.
- bojovyletoun
- Člen | 667
tohle jsem řešil, napíšu některé možnosti: při refreshování snipetů použít
- .live (předtím .die kvůli vícenásobnému navázání – na to pozor – třeba 5× odešleš formulář a pak to zavaří procesor a potažmo síť) – oproti bind funguje, když dynamicky přidáváš ajaxové formy/odkazy
- bind(/unbind – ze stejného důvodu)
- livequery plugin – to asi bude nejlepší řešení, ale já zvolil live
- 22
- Člen | 1478
@bojovyletoun: sry za OT, to je fakt s tim die()? Z čeho
vycházíš? v dokumentaci se nic takového nepíše, že by se mělo volat
die(). To jako jakože se ti ten ten event naváže 5x? Moc to nechápu, co tím
myslíš? http://api.jquery.com/live/
Jinak mám pocit, že bind() ti nic neřeší při překreslení snippetu,
protože pro DOM jsou to nové elementy a bind() se ti tedy nikam
nenaváže.
Editoval 22 (15. 5. 2011 13:21)
- bojovyletoun
- Člen | 667
1: prostuduj toto: https://componette.org/search/?…
Já to dělám tak, že inicializaci formů a všeho dělám po každém requestu. Z toho důvodu, pokud je samotný form ve snippetu, tak je třeba inicializovat validaci atd.
Příklad z praxe
- Případ, kdy je form ve snippetu, je třeba komentář pod článkem. Po odeslání form zmizí a místo něj se třeba ukáže „Názor přidán“.
- Nebo nějaké ajaxové filtry – nebo „spojené“ nádoby (inputy) – napadá mě převodník jednotek. Po prvním odeslání by se form neinicializoval při použítí bind.
K die
kdybych nevolal die, tak počet requstů při každém dalším odesláním formu roste xponencielně – 1,2,4,8,16.
Live
Řešil jsem obslužný js docela dlouho a nakonec došel právě k tomuto.
Bind vyřadím hned – je nutné ho volat po každém requstu a kromě toho
nepokryje, když třeba dynamicky vytvořím ajaxový odkaz. U ajaxových
odkazů je to jednoduché – tam stačí přidat handler k události
click – na to se hodí live. U formů je nutná i inicializace předem –
tam je nutné (pro formy ve snippetu při překreslení) je znovu inicializovat.
Až budu používat livequery, tak stačí jen na začátku skriptu
$(form).livequery(function(){nette.initform()} – samozřejmě
zjednodušeně – jq se postará o inicializaci ve vhodnou chvíli.
Taky bude nutné promyslet to z hlediska výkonu – livequery dokáže
žrát výkon.
No vypadá to, že se asi pustím do předělávání skriptu.
Poznámka
Co vy ostatní na to – považujete za dynamické přidávání ajaxových odkazů do stránky / používání formuláře jako součásti snippetu za časté (používané/praktické)? Ptám se z toho důvodu, jestli je tedy reinicializace formulářů/ajaxových odkazů žádoucí. Případně nějaké tipy ohledně toho, jak to udělat výkonově optimálně.
Editoval bojovyletoun (15. 5. 2011 14:01)
- 22
- Člen | 1478
pořád to nechápu s tím die(), přece se mi naváže na každý element
jen jednou, takže jak se mi může zvyšovat počet requestů? Já tedy
používám livequery(), což nevím, jestli je teď ještě úplně nutné,
když můžu spustit vlastní funkci přes trigger.
Můžeš mi sem hodit nějaký příklad, jak se geometricky zvyšuje počet
requestů při použití live() třeba proo click event?
- bojovyletoun
- Člen | 667
já to live volám právě při každém xhr požadavku.
Je to vidět na jednoduchém příkladu, kdy kliknutí na ajaxový odkaz změní
snippet s náhodným číslem. Po 5 kliknutích tam čísílka budou běhat
samy :)
Prakticky si to můžeš vyzkoušet tak, že po každém kliknutím na odkaz
do konzole zapíšeš tento kód
( předpokládám, že používáš https://componette.org/search/?…) –
tento kus kódu je nazýván funkcí initSnippet
$("a.ajax").live("click", function (event) {
event.preventDefault();
$.get(this.href);
// zobrazení spinneru a nastavení jeho pozice
$("#ajax-spinner").show().css({
position: "absolute",
left: event.pageX + 20,
top: event.pageY + 40
});
});
- bojovyletoun
- Člen | 667
Tak to nevím, co je příčina. K násobení požadavků docházelo, pokud byl odkaz mimo snippet (pokud by byl ve snippetu, tak se snippet nahradil novým lelementem a ke kumulaci by nedocházelo)
Editoval bojovyletoun (15. 5. 2011 15:00)
- cuga
- Člen | 210
neresil se tvuj problem tady: https://forum.nette.org/…-js-validaci ? az tak pozorne jsem cele vlakno necetl, ale mam z toho takovy pocit ;)