removeEventListener für anonyme Funktionen in JavaScript
Ich habe ein Objekt mit Methoden. Diese Methoden werden in das Objekt innerhalb einer anonymen Funktion. Es sieht wie folgt aus:
var t = {};
window.document.addEventListener("keydown", function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
});
(es gibt eine Menge mehr code, aber das ist genug, um das problem anzuzeigen)
Nun will ich aufhören, den Ereignis-listener in einigen Fällen. Deshalb bin ich versucht zu tun, ein removeEventListener aber ich kann nicht herausfinden, wie dies zu tun. Ich habe gelesen in anderen Fragen, es ist nicht möglich, den Anruf removeEventListener auf anonyme Funktionen, aber ist dies auch der Fall in dieser situation?
Ich habe eine Methode in t erstellt, in der anonymen Funktion und daher dachte ich, es war möglich. Sieht wie folgt aus:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
Warum kann ich nicht das tun?
Gibt es andere (gute) Möglichkeit, dies zu tun?
Bonus info; das hat nur zu funktionieren in Safari, daher die fehlende ie-Unterstützung.
InformationsquelleAutor der Frage bitkid | 2011-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, dass ist der Punkt, der eine anonyme Funktion, es fehlt ein name oder ein Weg zu verweisen.
Wenn ich du wäre würde ich Sie einfach erstellen Sie eine benannte Funktion, oder legen Sie Sie in eine variable, so haben Sie einen Hinweis darauf.
Können Sie dann entfernen Sie es, indem
InformationsquelleAutor der Antwort Adam Heath
wenn Sie innerhalb der eigentlichen Funktion, die Sie verwenden können, Argumente.angerufene als ein Verweis auf die Funktion. in:
EDIT:
Das wird nicht funktionieren, wenn Sie im strikten Modus (
"use strict";
)InformationsquelleAutor der Antwort Otto Nascarella
Einer version von Otto Nascarella's Lösung, die funktioniert in der strict-Modus eingeschaltet ist:
InformationsquelleAutor der Antwort Melle
Kann mehrere anonyme Funktionen, keydown[1]
InformationsquelleAutor der Antwort user3519897
Eine nicht so anonyme option
Da das feedback von Andy (ganz in Ordnung, aber wie mit vielen Beispielen wollte ich zeigen, eine kontextbezogene Ausweitung der Idee), hier ist eine weniger kompliziert exposition:
Dies ermöglicht eine im Grunde anonyme Funktion, Struktur, vermeidet die Verwendung der praktisch veraltet angerufeneund ermöglicht die einfache Entfernung.
Übrigens: Das entfernen des script-Elements sofort nach Einstellung der Hörer ist ein netter trick für das ausblenden von code würde man lieber nicht unübersehbar zu neugierigen Augen (würde Euch die überraschung verderben 😉
Also die Methode (mehr einfach):
InformationsquelleAutor der Antwort Fred Gandt
JavaScript: addEventListener
- Methode registriert den angegebenen listener auf dem EventTarget(Element|Dokument|Fenster) es heißt auf.
EventTarget.addEventListener(event_typehandler_function, Bubbling|Capturing);
Maus, Tastatur Veranstaltungen Beispiel test in der WebConsole:
removeEventListener
Methode entfernt das Ereignis-listener registriert mit EventTarget.die Methode addEventListener().
caniuse
InformationsquelleAutor der Antwort Yash
Geben eine mehr up-to-date Ansatz:
InformationsquelleAutor der Antwort Jonatas Walker
Dies ist nicht ideal, da es löscht alle, aber die funktionieren könnte für Ihre Bedürfnisse:
Knoten.cloneNode()
InformationsquelleAutor der Antwort
Vielleicht nicht die beste Lösung in Bezug auf, was Sie Fragen. Ich habe noch nicht festgestellt, eine effiziente Methode zum entfernen von anonyme Funktion deklariert inline mit dem Ereignis-listener-Aufruf.
Ich persönlich benutze eine variable zum speichern der
<target>
und erklären die Funktion außerhalb des Ereignis-listener-Aufruf zB:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Dann an den listener entfernen:
target.removeEventListener('click', myFunc);
Nicht die top-Empfehlung, die Sie erhalten, aber zu entfernen, anonyme Funktionen die einzige Lösung, die ich gefunden habe, nützlich ist, entfernen, dann ersetzen Sie den HTML-element. Ich bin sicher, es muss einen besseren vanilla-JS-Methode, aber ich habe ihn noch nicht gesehen.
InformationsquelleAutor der Antwort Shay Connolly
Habe ich stolperte über das gleiche problem und das war die beste Lösung, die ich bekommen konnte:
Bitte halten Sie im Verstand ich habe nur getestet, für die
window
element und für die'mousemove'
Ereignis, so könnte es einige Probleme mit diesem Ansatz.InformationsquelleAutor der Antwort Gark Garcia
InformationsquelleAutor der Antwort Dun