Autor Zpráva
vlkodlak
Profil
Zdravím,

řeším následující kód a nerozumím proč se nepsuti se

na web stránce mam tlačítko:
     
<input id="addnewitem" type="button" value="Add new Absence" class="button btn btn-success" >



v definici jQuery mam následující ... na konec stránky přidám tlačítko, které do konzole má vypsat pozdrav ... vložení proběhne, ale vypsáni pozdravu již ne
$(document).ready(function () {
     $("input#addnewitem").click(function () {
       $('body').after('<a id="metlacitko" data-id="2021-01-13" href="#">Pozdrav</a>');
     });
     
     
     $("a#metlacitko").click(function () {
       console.log("ahoj pane");
     });

});

prosím o radu jak zprovoznit funkci na událost $("a#metlacitko")
Serg
Profil
Protože ten odkaz/tlačítko s id "metlacitko" se vytvoří až po kliknutí na input "addnewitem", ale to nastavení události se provede hned po načtení stránky, kdy jsi ještě nemohl stihnout kliknout na ten input button a tím vytvořit to "#metlačítko". Javascript teda vidí příkaz aby našel element s id "metlačítko" a tomu přiřadil funkci po kliknutí, ale jelikož žádný takový element nenajde, tak tu funkci ničemu nepřiřadí.

Klidně si zkus na konec té ready funkce vypsat: console.log($("a#metlacitko").length), řekl bych že to bude 0.

Vyřešit by to šlo např. nastavením té onclick funkce až po vytvoření toho tlačítka.

$(document).ready(function () {
     $("input#addnewitem").click(function () {
       // vytvoreni tlacitka
       $('body').after('<a id="metlacitko" data-id="2021-01-13" href="#">Pozdrav</a>');
       // prirazeni eventu
       $("a#metlacitko").click(function () {
          console.log("ahoj pane");
       });
     });
});

Mimochodem, na stránce by nemělo být víc prvků se stejným id, díky tomu nemá moc smysl do selektoru psát jméno tagu ("a#metlacitko") ale stačí jen to id ("#metlacitko"), a jestli by tam mělo být těch tlačítek víc, tak místo id je potřeba použít class.
Keeehi
Profil
Ještě existuje další možnost. A tou je využít delegované události. V takovém případě se událost nastaví rodiči který v době nastavování existuje (v mém případě jsem zvolil body ale může to být klidně něco bližšího tomu budoucímu odkazu) a filtr, který pak při té události kontroluje, zda to vzniklo na daném elementu. Jelikož se to kontroluje až při vzniku té události, bude už v tu chvíli existovat to tvoje tlačítko.

$(document).ready(function () {
     $("input#addnewitem").click(function () {
       $('body').after('<a id="metlacitko" data-id="2021-01-13" href="#">Pozdrav</a>');
     });
     
     
     $("body").on("click", "a#metlacitko", function () {
       console.log("ahoj pane");
     });
});

Poznámka Serg o id atributu samozřejmě platí i zde. Chtěl jsem však ukázku nechat co nejpodobnější.
vlkodlak
Profil
děkuji vám panové, v kombinaci s vašimi tipy jsem si také všiml, že tlačítka jsem přidávám mimo BODY což na funkčnosti moc nepřidávalo
anonym_
Profil *
vlkodlak:
jsem si také všiml, že tlačítka jsem přidávám mimo BODY
To ničemu moc nevadí. První konec body bude v DOMu ignorován, nový konec body se utvoří na konci stránky.

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