2013-09-16 8 views
13

Mein Onclick-Ereignis funktioniert. Wenn dieses onclick -Ereignis jedoch in dynamischem HTML ist, funktioniert es nicht mehr. Wie in: nichts passiert.jQuery onclick feuert nicht auf dynamisch eingefügte HTML-Elemente?

$(document).ready(function() { 
    $("#guestlist .viewguestdetails").click(function() {   
     $(".guestdetails[data-id='18']").toggle(); 
    }); 
}); 

ich dann HTML zu einer Seite dynamisch hinzugefügt:

<div id="guestlist">  
    <span class="completeguestdetails" data-id="18">(add your data)</span> 
     <div class="guestdetails" data-id="18" style="display: none;"> 
      some data 
     </div> 
</div> 

aber wenn ich auf, dann „(Ihre Daten addieren)“ nichts passiert. Wenn ich den HTML-Code statisch auf meiner Seite habe, funktioniert das Umschalten des Divisors 'guestdetails'. Es scheint, dass kein Ereignis mit dynamisch eingefügtem HTML verknüpft ist.

UPDATE:

Die neue dynamische HTML-I i eine Zeile in einer vorhandenen Tabelle bin einfügen. Die anderen Reihen haben bereits Veranstaltungen zu den Onclick Ereignisse gebunden, wie:

$("span.guestattendance").click(function() { 
    if ($(this).hasClass('checkbox-on')) { 
     $(this).removeClass('checkbox-on').addClass('checkbox-off'); 
     $("#guestday").removeClass('checkbox-on').addClass('checkbox-off'); 
    } 
    else { 
     $(this).removeClass('checkbox-off').addClass('checkbox-on');    
     if ($("#guestceremony").hasClass('checkbox-on') && $("#guestreception").hasClass('checkbox-on') && 
     $("#guestdiner").hasClass('checkbox-on') && $("#guestparty").hasClass('checkbox-on')) { 
      $("#guestday").removeClass('checkbox-off').addClass('checkbox-on'); 
     } 
    } 
}); 

Da kann ein Benutzer mehr als 1 Zeile einzufügen, ich nicht die ID verwendet haben, sondern ein Wrapper um das Element hinzugefügt Ich bin Einfügen:

und dann in ready() Funktion:

$('.newrow_wrapper').on('click', 'span', function() { 
    $(".guestdetails[data-id='" + $(this).attr('data-id') + "']").toggle(); 
}); 

Das erste Problem ist jedoch, dass offenbar, wenn ich ein div wickeln um eine tr-Tag, alle t r und td Tags werden aus dem eingefügten HTML entfernt! Auch wenn ich auf den Bereich klicke, um die Gastdetails anzuzeigen, passiert nichts.

Antwort

30

tun:

$('#wrapper').on('click', 'a', function() { ... }); 

wo #wrapper ein statisches Element, in dem Sie die dynamischen Links hinzufügen.

So haben Sie einen Wrapper, der in den HTML-Quellcode codiert hart ist:

<div id="wrapper"></div> 

und Sie es mit dynamischen Inhalten füllen. Die Idee besteht darin, die Ereignisse an diesen Wrapper zu delegieren, anstatt Handler direkt an die dynamischen Elemente zu binden. elements.Here ist der Link zur Dokumentation http://api.jquery.com/on/

etwas schreiben wie diese

 $('#someid').on('click', function() { ... }); 

oder so etwas wie dieses

+0

Ich habe dies versucht, finden Sie in meinem aktualisierten Beitrag. Aber es funktioniert nicht ... was vermisse ich? – Flo

+0

Nützliche Antwort, speicherte meine Zeit –

10

Verwenden .on() Ereignishandler zu befestigen, die dynamisch die HTML bindet.

  $(document).on('click', 'tag_name', function() { ... }); 
+0

Danke ... Funktioniert wie ein Charme .... :) –

+0

"on" click bindet dieses Ereignis für alle zukünftigen Elemente mit dem 'tag_name'.Deshalb ist dies etwas Besonderes im Vergleich zu "click", die das Ereignis nur an die aktuellen Elemente binden. Wann immer Sie Ereignisse für dynamisch geladene Elemente binden müssen, verwenden Sie "on". – Dhanuka777

+0

nur die zweite funktionierte für mich. – Golnar

4

jQuery.on() wird verwendet, auf dynamisch eingefügt HTML-Elemente jedes Ereignis zu binden. Verwenden Sie es wie folgt:

$(document).ready(function() { 
    $(document).on('click',"#guestlist .viewguestdetails",function() {   
     $(".guestdetails[data-id='18']").toggle(); 
    }); 
}); 
Verwandte Themen