26

Es tut mir leid, wenn dies eine allgemeine Frage ist, aber ich konnte keine Antworten finden, die relevant durch die Suche schien.Wie kann ich einen Ereignis-Listener mithilfe einer Funktion mit Parametern hinzufügen und entfernen?

Wenn ich einen Ereignis-Listener wie folgt anhängen:

window.addEventListener('scroll', function() { check_pos(box); }, false); 

es nicht zu funktionieren scheint zu versuchen, es später zu entfernen, wie folgt aus:

window.removeEventListener('scroll', function() { check_pos(box); }, false); 

Ich nehme an, das liegt daran, dass die addEventListener und Methoden wollen einen Verweis auf die gleiche Funktion, während ich ihnen mit anonymen Funktionen, die, während im Code identisch sind, sind nicht buchstäblich die gleichen.

Wie kann ich meinen Code ändern, um den Anruf an zu erhalten? Das Argument "Box" bezieht sich auf den Namen einer , die ich auf dem Bildschirm track; das heißt, ich möchte das scroll Ereignis einmal für jede , die ich habe (die Menge variiert) abonnieren, und sobald die check_pos() Funktion eine bestimmte Position misst, wird es eine andere Funktion aufrufen und auch den Ereignis-Listener zu befreien Systemressourcen hoch.

Meine Ahnung ist, dass die Lösung eine Schließung und/oder Benennung der anonymen Funktion beinhaltet, aber ich bin mir nicht sicher, wie das genau aussieht und würde ein konkretes Beispiel schätzen.

Hoffnung, die Sinn macht. Danke für jede Hilfe!

Antwort

14

Haben Sie versucht, einen Verweis auf die anonyme Funktion zu verwalten (wie von Ihnen vorgeschlagen)?

So:

var listener = function() { 
    check_pos(box); 
}; 

window.addEventListener('scroll', listener, false); 
... 
window.removeEventListener('scroll', listener, false); 

Mozillas docs suggest das Gleiche.

+0

Danke, Vivin - korrigiert mich wenn ich falsch liege, aber ich glaube nicht, das ich mehrere Event-Listener mit unterschiedlichen Werten für „Feld“ einzurichten erlauben würde, das ist, was ich tun muß. Das Argument "Box" ist keine globale Variable. Wenn ich zum Beispiel nur literale Werte verwende, kann ich 'window.addEventListener ('scroll', function() {do_something ('string1');}, false);' und später 'window.removeEventListener ('scroll', function () {do_something ('string1');}, false); 'und später' window.addEventListener ('blättern', function() {do_something ('string2');}, false); 'usw. – Bungle

+0

Es gibt ein Möglichkeit, mehrere Ereignis-Listener mithilfe von Closures hinzuzufügen (siehe http://stackoverflow.com/questions/2276961/is-there-for-window-onload-in-javascript/2277000#2277000). Ich würde jedoch empfehlen, jQuery zu verwenden, wenn Sie eine ernsthafte Ereignisbehandlung durchführen möchten. Es macht es viel einfacher. –

3
var listener; 

listener = function(){ 

if(window.target != anotherEvent.target) 
{ 
    ...CODE where 

    window.removeEventListener('click', listener , false); 

}; 

window.addEventListener('click', listener ,false); 
Verwandte Themen