Autor Zpráva
HeWeR
Profil
Zdravím,
snad celé dnení ráno si lámu hlavou nad tímto problémem:

Načtu si na na určenou akci do stránky index.php AJAXovém loadem část nějáké jiné stránky:

$("#SemMiToHod").load("soubor.php #tentoprvek");


V pohodě, prvek se nakrásno načte. Řekněme, že má kód:

<div id="tentoprvek"><p id="hop">Click!</p></div>


A taky uvažujme, že v JavaScriptovém kódu stránky index.php je deklarováno toto:

$("#hop").click(function(){
  alert("BafikyBaf!");
});


Člověk by správně očekával, ale po AJAXovém NAČTENÍ do DOMu dokumentu a po kliknutí na "Click!", nám vyskočí alert "BafikyBaf". Jenomže to nefunguje.

1. Nevíte proč? Nevidím v tom logiku. Pokud si #tentoprvek vložím např. pomocí "append" (tzn. IMHO úplně stejným způsobem do dokumentu), vše funguje.
2. Nevíte, jak to obejít? Potřebuju navazovat na části "loadnuté" stránky další JavaScriptové akce.

Děkuji!
nightfish
Profil
zkus to nahradit za

$("p#hop").live('click', function(e){
  alert("BafikyBaf!");
});


Člověk by správně očekával, ale po AJAXovém NAČTENÍ do DOMu dokumentu a po kliknutí na "Click!", nám vyskočí alert "BafikyBaf". Jenomže to nefunguje.
zřejmě chování jQuery - bind() nefunguje na prvky přidané v budoucnu, zatímco live() ano
_es
Profil
HeWeR:
Treba uvažovať o tom, kedy sa ktorý príkaz JavaScriptu vykoná.
Nepoznám veľmi jQuery, no nevykoná sa príkaz $("#hop").click(function(){ alert("BafikyBaf!");}); vtedy, keď ten prvok ešte neexistuje?
Nenastáva po tom "nahratí" prvku zmazanie jeho udalostí?
Nox
Profil
nightfish:
zřejmě chování jQuery - bind() nefunguje na prvky přidané v budoucnu, zatímco live() ano
Nejsem expert na JS, ale myslím že to není až tak jQuery chování, je to stejné jako bych chtěl dát onclick handler na neexistující prvek,
naopak live je spíš spešl věc, že se aplikuje plošně i na později přidané

Jinak s oběma příspěvkama souhlasím

Možná je alternativa:
$("#SemMiToHod").load("soubor.php #tentoprvek", function(){ $("#hop").click(function(){ alert("BafikyBaf!"); }); });

ale nejsem si jistý jestli se ten callback náhodou nezavolá sice po získání dat, ale ještě před vložením do stránky, ten live() bude jistější
HeWeR
Profil
nightfish:
zřejmě chování jQuery - bind() nefunguje na prvky přidané v budoucnu, zatímco live() ano

Tomu sem právě nerozumněl. Když prvek přidám např. pomocí .html(), tak na něj bind funguje normálně. Mám to teda chápat tak, že je rozdíl, když:
- script sám něco dopíše (append, html, val)
- script načte jiný kus kódu z nějákého jiného zdroje?

Jinak, live() funguje. Děkuju!

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: