565 Stimmen

Klick-Ereignis funktioniert nicht bei dynamisch erzeugten Elementen

<html>
<head>
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">

        $(document).ready(function() {

            $("button").click(function() {
                $("h2").html("<p class='test'>click me</p>")
            });   

            $(".test").click(function(){
                alert();
            });
        });

    </script>
</head>
<body>
    <h2></h2>
    <button>generate new element</button>
</body>
</html>

Ich habe versucht, ein neues Tag mit dem Klassennamen test dans le <h2> indem Sie auf die Schaltfläche klicken. Ich habe auch ein Klick-Ereignis definiert, das mit test . Aber das Ereignis funktioniert nicht.

Kann jemand helfen?

13voto

qwertymk Punkte 32302

Ändern Sie

 $(".test").click(function(){

An

 $(".test").live('click', function(){

LIVE-DEMO

jQuery .live()

8voto

DSKrepps Punkte 641

トライ .live() o .delegate()

http://api.jquery.com/live/

http://api.jquery.com/delegate/

Su .test Element wurde nach dem .click() Methode, so dass das Ereignis nicht mit ihr verknüpft war. Live und Delegate geben diesen Ereignisauslöser an übergeordnete Elemente, die ihre Kinder überprüfen, so dass alles, was danach hinzugefügt wird, immer noch funktioniert. Ich denke, dass Live den gesamten Dokumentenkörper prüft, während Delegate einem Element zugewiesen werden kann, so dass Delegate effizienter ist.

Mehr Informationen:

http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/

7voto

Jay Patel Punkte 5770

Der beste Weg, um Ereignisse auf dynamisch generierte Inhalte anzuwenden, ist die Delegation.

$(document).on("eventname","selector",function(){
    // code goes here
});

Ihr Code sieht also folgendermaßen aus

$(document).on("click",".test",function(){
    // code goes here
});

7voto

user3425150 Punkte 73

In der Dokumentation von jQuery habe ich zwei Lösungen gefunden:

Erstens: Delegieren auf Body oder Dokument verwenden

z.B:

 $("body").delegate('.test', 'click', function(){
 ...
  alert('test');
 });

Warum?

Antwort: Anhängen eines Handlers an ein oder mehrere Ereignisse für alle Elemente, die dem Selektor entsprechen, jetzt oder in Zukunft, basierend auf einer bestimmten Gruppe von Root-Elementen. Link: http://api.jquery.com/delegate/

Zweitens: Setzen Sie Ihre Funktion in die "$( document )" , mit "ein" und fügen Sie es an das Element an, das dieses Ereignis auslösen soll. Der erste Parameter ist der "Event-Handler", der zweite: das Element und der dritte: die Funktion. Z.B.:

 $( document ).on( 'click', '.test', function () {
 ...
  alert('test');
 });

Warum?

Antwort: Event-Handler sind nur an die aktuell ausgewählten Elemente gebunden; sie müssen auf der Seite vorhanden sein, wenn Ihr Code den Aufruf an .on() . Um sicherzustellen, dass die Elemente vorhanden sind und ausgewählt werden können, führen Sie eine Ereignisbindung innerhalb eines Document Ready-Handlers für Elemente durch, die im HTML-Markup der Seite enthalten sind. Wenn neues HTML in die Seite eingefügt wird, wählen Sie die Elemente aus und fügen Ereignishandler hinzu, nachdem das neue HTML in die Seite eingefügt wurde. Oder verwenden Sie delegierte Ereignisse, um einen Ereignishandler anzuhängen, wie im Folgenden beschrieben ... Link: https://api.jquery.com/on/

4voto

Nikolaus Pluta Punkte 41
$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});

Funktioniert nur, wenn das DIV mit der Klasse .surrounding_div_class das unmittelbare Elternteil des Objekts .test ist

Wenn sich ein anderes Objekt im Div befindet, das gefüllt werden soll, funktioniert es nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X