Gibt es eine Möglichkeit, diese Art von Ereignis-Listenern zu entfernen ...
Nein, nicht mit addEventListener
/removeEventListener
. Aber du hast jquery 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 jquery 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
.
@Quentin entfernen: Ich glaube, du hast Recht. :-) Danke –
Wie entfernt die jquery 'off' Methode Event Listener ohne den Namen der Funktion zu benutzen? Verwendet es etwas anderes als 'removeEventListener'? – user31782
@ 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.) –