Autor Zpráva
RastyAmateur
Profil
Krásné poledne..

Mám script, který funguje tak jak má, ale jen jednou. V případě, že ho vykonám podruhé (kliknu na tlačítko), nic se nestale. Proč?

 $("#newnotesubmit").click(function(){
    var rndtop = Math.floor(Math.random() * 90) + 10;
    var rndleft = Math.floor(Math.random() * 90) + 10;
    $("#newnotediv").hide(350);
    $("#main").html(($("#main").html()) + "<div class=\"note move\" style=\"top: " + (rndtop) +"%; left: " + (rndleft) + "%; display: none;\">" + ($("#textareanote").val()) + "</div>");
    $(".note").show(350);
    $("#textareanote").val("");
    });



Ještě jedna chyba - po kliknutí se sice provedel řádek 5, ale řádek 4 ne...
Chamurappi
Profil
Reaguji na RastyAmateura:
Co je v #main? Všechno? Pokud ano, tak:
1) Nastavíš reakci na klik na element s id="newnotesubmit".
2) Při kliku převedeš všechno na HTML kód a něco k tomu HTML přidáš.
3) Zrušíš všechno (včetně toho elementu s id="newnotesubmit").
4) Vytvoříš nové všechno (se zbrusu novým elementem s id="newnotesubmit") z HTML kódu.
5) Divíš se, že na novém elementu není nastavená reakce na klik.

Převádění kusu DOMu na HTML následované převodem HTML zpátky na kus DOMu je dost destruktivní činnost (viz i starší popis). Nedělej to, pokud o tu destrukci úmyslně neusiluješ…
RastyAmateur
Profil
Chamurappi:
Moc to nechápu

var oldhtml = $("#main").html(); // (1)
var nevhtml = oldhtml + "nove html";  // (2)
// 3, 4 a 5 nechápu



VYŘEŠENO: #main se skládá ze statické části a dynamické části. Tu dynamickou část jsem ohraničil divem a impletoval jsem to na řádek 5 ([#1]). Nyní vše funguje jak má (zatím)

jinak samozřejmě děkuji Chamurappimu za reakci
Chamurappi
Profil
Reaguji na RastyAmateura:
Z těch dvou řádků je první to, co jsem napsal jako 2), a druhý to, co jsem napsal jako 3) a 4).
Asi nad tím budeš muset víc přemýšlet, myslím, že jsem to popsal správně.

Tu dynamickou část jsem ohraničil divem a impletoval jsem to na řádek 5
Proč máš vůbec potřebu převádět nějaký existující element na HTML kód? K čemu ti to je?
RastyAmateur
Profil
Přidával jsem přes ajax poznámku. A aby se zobrazila a nemusela se aktualizovat stránka, tak jsem to řešil tímto způsobem
Kcko
Profil
RastyAmateur:
Změn to takhle

$(document).on('click', '#newnotesubmit', function(){
RastyAmateur
Profil
Kcko:
V čem to je lepší?
Chamurappi
Profil
Reaguji na RastyAmateura:
Dobrý záměr, špatná implementace. K tomu, abys něco někam přidal, přeci nemusíš přemazávat existující blok.

V čem to je lepší?
Chytá to každé kliknutí na celé stránce a dodatečně to vyhodnocuje, jestli jsi kliknul do něčeho, co odpovídá selektoru #newnotesubmit. Pak můžeš přemazávat cokoliv, je to už fuk, protože klik se zachytí v rámci dokumentu. Což nic nemění na tom, že zničit skupinu elementů jen proto, abys je vytvořil znovu, není moc efektivní a koleduješ si tím o víc problémů, než jen zrušení navázaných událostí.
RastyAmateur
Profil
Chamurappi:
A jaká by byla lepší impletace? Koukal jsem na ten odkaz, a řešení s += mi nefungovalo (je možné, že jsem to napsal špatně).

Chytá to každé kliknutí na celé stránce a dodatečně to vyhodnocuje, jestli jsi kliknul do něčeho, co odpovídá selektoru #newnotesubmit. Pak můžeš přemazávat cokoliv, je to už fuk, protože klik se zachytí v rámci dokumentu.
Tak jestliže to zachycuje všechna kliknutí, tak bych tipoval, že to je spíše horší než lepší. Ovšem tu druhou větu moc nechápu - co znamená "být zachycený v rámci dokumentu"?
Keeehi
Profil
RastyAmateur:
A jaká by byla lepší impletace?
Pracovat s DOMem. api.jquery.com/append
RastyAmateur
Profil
Keeehi:
Přidáno, děkuji!

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:

0