Autor Zpráva
Lisoe
Profil *
Zdravím,

narazil jsem na problém, kdy přes ajax načítám formulář:

    $('.ticket-action').click(function() {        
        var ticket_id = $( this ).val();   
        
        $.ajax({
            url:"/api/registration-form.php",
            method:"POST",
            data:{ticket_id:ticket_id, action:'get_data'},
            success:function(data){
                $('#ticket-item-wrapper').hide().html(data).fadeIn(1500);
                $(".abcd").on("click", function(){
                    alert('test');
                });
            }
        });
    });
    
   
     $(".abcd").on("click", function(){
         alert('test');
     }); 

Ale ve chvilku, kdy kliknu na element se třídou abcd, tak se nic nestane.

Pokud však upravím script tak, že vložím část s abcd do success:function(data), tak po kliknutí na element abcd vše funguje v pořádku:
    $('.ticket-action').click(function() {        
        var ticket_id = $( this ).val();   
        
        $.ajax({
            url:"/api/registration-form.php",
            method:"POST",
            data:{ticket_id:ticket_id, action:'get_data'},
            success:function(data){
                $('#ticket-item-wrapper').hide().html(data).fadeIn(1500);
                $(".abcd").on("click", function(){
                    alert('test');
                });
            }
        });
    });


Ovšem vzhledem k tomu, že ve formuláři řeším několik pravidel, nechce se mi vše takto vkládat. Dá se to vyřešit nějak jinak, elegantněji?

Moc díky za pomoc
Mlocik97
Profil
Som blbej, alebo medzi tými kódmi není žiadny rozdiel?

inak data môžete predať v parametri do funkce, alebo do nejakého objektu v ľubovoľnom scope. To som asi jediné pochopil že asi chcete.
Keeehi
Profil
Mlocik97:
Předpokládám, že řádek 10 - 12 v tom prvním scriptu zapomněl smazat.

Lisoe:
Je to samozřejmě kvůli tomu, že v prvním případě nastavuješ onclick elementu s třídou abcd který ještě neexistuje, jelikož ten bude vytvořen až když se vrátí odpověď ze serveru na ajaxový požadavek. Takže buď to tomu elementu nastavíš až potom co je vytvořen, jako to správně děláš v druhém případě. Případně alternativně se to dá zapsat jako:
        $.ajax({
            ...
        }).done(function(){
            $(".abcd").on("click", function(){
                alert('test');
            });
        });

A nebo druhé řešení je nastavit ten event nějakému z rodičů toho budoucího elementu. Dá se klidně použít document, nebo body, jelikož ty d největší pravděpodobností budou vždy už dávno existovat. Je ale lepší použít co nejbližšího předka. V tvém případě to vypadá na element s id ticket-item-wrapper.
$("#ticket-item-wrapper").on("click", ".abcd", function() {
    alert('test');
});

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