2016-06-26 8 views
0

Ich habe Event-Listener mit Funktion innerhalb der Ereignis-Listener definiert als:So entfernen Sie EventListener mit der im EventLizenzer definierten Funktion?

$("body")[0].addEventListener("click", function my3(){alert(786)}); 

Wenn ich jetzt versuchen, diese Eventlistener zu entfernen:

$("body")[0].removeEventListener("click", function my3); 

ich den Fehler, dass my3 nicht definiert ist. Gibt es eine Möglichkeit, diese Art von Ereignislistenern zu entfernen oder my3 Funktion außerhalb des Ereignis-Listener zu definieren ist der einzige Weg ?.

Antwort

4

Gibt es eine Möglichkeit, diese Art von Ereignis-Listenern zu entfernen ...

Nein, nicht mit addEventListener/removeEventListener. Aber du hast getaggt, also lies weiter, denn du kannst mit jQuery.

... oder die my3-Funktion außerhalb des Ereignis-Listeners zu definieren ist der einzige Weg?

Es ist der einzige Weg mit addEventListener/. Sie benötigen müssen einen Verweis auf die Funktion haben, die hinzugefügt wurde, um es zu entfernen. Also:

// Declare the function 
function my3() { 
    alert(786); 
} 

// Add it 
$("body")[0].addEventListener("click", my3); 

// Later, remove it 
$("body")[0].removeEventListener("click", my3); 

Sie haben Ihre Frage markiert, also werde ich beachten Sie, dass das nicht wahr der Handler mit jQuery angebracht, weil jQuery seine eigene Liste von Event-Handler unterhält, anstatt mit dem nativen DOMs Liste. Das bedeutet, dass Sie alle Handler für ein Ereignis, die mit jQuery verknüpft wurden, aus einem Element entfernen können, ohne eine Referenz darauf zu haben, und/oder jQuery's "namespaced" -Ereignisse verwenden, um nur eine Teilmenge von ihnen zu entfernen, ohne Referenzen darauf zu haben .

Zum Beispiel:

$("body").on("click.foo", function my3() { alert(786); }); 

Dort haben wir "Namespace" unser Click-Handler mit foo. Später können wir unsere Handler entfernen, ohne anderen Klick-Handler zu beeinflussen:

$("body").off("click.foo"); 

Einzelheiten in der Dokumentation zu on und off.

+0

@Quentin entfernen: Ich glaube, du hast Recht. :-) Danke –

+0

Wie entfernt die jquery 'off' Methode Event Listener ohne den Namen der Funktion zu benutzen? Verwendet es etwas anderes als 'removeEventListener'? – user31782

+0

@ user31782: Ja. Wie ich oben sagte, verwendet es seine eigene Liste von Handlern. Es hat einen einzigen Event-Handler, den es registriert (auf den es einen Verweis hält) und verwendet dann diesen Handler, um alle registrierten Handler für dieses Event auf diesem Element aufzurufen. Auf diese Weise kann jQuery sicherstellen, dass Handler in der DOM2-Ereignisreihenfolge aufgerufen werden, obwohl der alte IE sie im Gegensatz zur DOM2-Reihenfolge aufgerufen hat. (Nicht die Schuld von Microsoft zuerst, sie kamen zuerst dorthin. Es war MS durch IE8 schuld, dafür, den Punkt-sehr-reifen Standard nicht zu unterstützen.) –

0

Eine weitere Option ist .onclick zu verwenden, in dem Sie den Handler mit document.body.onclick = null