2012-06-22 9 views
6

Die erste .click-Funktion wird verwendet, um ein Element (div) in einen Container einzufügen, und der zweite wird verwendet, um es aus dem Container zu entfernen. Der Container hat zunächst keine Elemente. Das Entfernen der Funktion durch Anklicken nicht funktioniertDie zweite .click() - Funktion funktioniert nicht

$(document).ready(function(){ 
    $(".class1").click(function(){ 
     //Code for adding element to the container and 
     // removing class1 from it and adding class2 

    }); 

    $(".class2").click(function(){ 
     alert("hi"); //Even the alert is not displayed 
     $(this).fadeOut(100);  
    }); 
}); 

Allerdings funktioniert es, wenn das Element bereits vorhanden ist, bevor die Seite geladen wird in den Behälter. Gründe warum? Liegt es an der document.ready-Funktion? Lösungen?

+3

geben Sie uns bitte Ihre HTML. –

+0

pls post the html – Sudantha

+0

Wenn Sie ein Ereignis zum '.class2' Element hinzufügen, existiert Ihr Element bereits? –

Antwort

14

das, weil ist, wenn Sie die Click-Handler für .class2 Elemente sind das Hinzufügen, sind Sie nur das Ereignis Hinzufügen von Elementen, die diese Klasse haben zu diesem bestimmten Zeitpunkt; z. B. keine.

Stattdessen müssen Sie Event Delegation wie folgt verwenden;

$(document).on('click', '.class2', function() { 
    alert('hi'); 
    $(this).fadeOut(100); 
}); 

Dies funktioniert, da es ein Ereignis document (die immer vorhanden ist) bindet, die für Klicks auf allen .class2 Elementen Ereignis Delegation hört. Weitere Informationen finden Sie in der Dokumentation on().

+0

chrome Block dieses Skript –

+0

@mohsen: Ich würde das überprüfen. Der Code ist nichts ungewöhnliches. Es wäre extrem seltsam für Chrome, es zu blockieren. – Matt

+0

Ich benutze .ON Funktion, um dynamisch Hyperlink zu ändern, aber Chrom blockiert meine zweiten Änderungen auf Hyperlink. (übrigens, Hyperlink enthalten (java: win.open ....) aber kein Problem in der ersten Verbindung, zweite dynamisch durch ändern.auf allen Browser blockiert) –

1

Während Sie versuchen, den Code zum Klicken .class2 hinzuzufügen, ist es noch nicht erstellt, wie ich verstehe. Versuchen Sie, das Click-Ereignis, nachdem Sie das .class2 Element wie folgt erstellt:

$(document).ready(function(){ 
    $(".class1").click(function(){ 
      //Code for adding element to the container and removing class1 from it and adding class2 

     $(".class2").click(function(){ 
      alert("hi");   //Even the alert is not displayed 
      $(this).fadeOut(100); 

     }); 
    }); 
}); 
+0

Das fügt den vorhandenen '.class2' -Elementen einen Event-Handler hinzu. – Matt

+0

Ja, Sie haben Recht. Deine Antwort ist die richtige. Danke: Ich wusste nichts über Delegation in jQuery! – devsnd

3

Verwenden Sie Delegate-Ereignishandler für beide Klassen (wenn Sie zwischen beiden wechseln, oder wenn Sie nicht zurück zu class1 dann zweite ist genug), weil nach der Änderung class Elemente als dynamisch behandelt werden.

$("#container").on("click", ".class1", function(){ 

}); 

$("#container").on("click", ".class2", function(){ 

}); 

Hier #container bezieht sich auf die Eltern jener Klasse, können Sie etwas anderes haben.

0

Die Ereignisse können nicht auf Elemente angewendet werden, die nicht vorhanden sind, wenn die Funktion ausgearbeitet wird. Aber könnten Sie ein Wrapper-Element (div) um „Class1“ und „Klasse 2“, wie diese zu erstellen:

<div id="class1_wrapper"> 
    <span class="class1"> 
</div> 

Ich benutzte „span“ für class1, weil ich weiß nicht, welches Element es sich handelt. Dann wird anstelle des Click-Ereignis, könnten Sie „on()“ verwenden:

$("#class1_wrapper").on("click", ".class1", function() 
{ 
    //Code for adding element to the container and removing class1 from it and adding class2 
}); 

auf diese Weise, auch wenn class1 nicht da ist (das gleiche gilt für Klasse 2 durchgeführt werden kann), wird das Click-Ereignis

laufen
+0

Danke Matt für die Korrektur meines Tippfehlers :) –

Verwandte Themen