26

Scusate se questa è una domanda comune, ma non sono riuscito a trovare alcuna risposta che sembrava pertinente tramite la ricerca.Come aggiungere e rimuovere un listener di eventi utilizzando una funzione con parametri?

Se io attribuisco un listener di eventi come questo:

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

non sembra di lavorare per cercare di rimuoverlo dopo, in questo modo:

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

Presumo che ciò è perché il I metodi addEventListener e removeEventListener vogliono un riferimento alla stessa funzione, mentre io ho fornito loro funzioni anonime, che, sebbene identiche nel codice, non sono letteralmente uguali.

Come posso modificare il mio codice per far funzionare la chiamata a removeEventListener? L'argomento "box" si riferisce al nome di uno che sto monitorando sullo schermo; cioè, voglio essere in grado di sottoscrivere l'evento scroll una volta per ogni che ho (la quantità varia), e una volta che la funzione check_pos() misura una determinata posizione, chiamerà un'altra funzione e rimuoverà il listener di eventi a free risorse di sistema.

La mia impressione è che la soluzione comporterà una chiusura e/o la denominazione della funzione anonima, ma non sono sicuro di cosa sia esattamente l'aspetto e apprezzerei un esempio concreto.

Spero che abbia senso. Grazie per qualsiasi aiuto!

risposta

14

Hai provato a mantenere un riferimento alla funzione anonima (come hai suggerito)?

Quindi:

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

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

documenti di Mozilla suggest la stessa cosa.

+0

Grazie, Vivin, correggimi se sbaglio, ma non penso che questo mi consenta di impostare più listener di eventi con valori diversi per "box", che è quello che devo fare. L'argomento "box" non è una variabile globale. Ad esempio, usando solo valori letterali, potrei chiamare 'window.addEventListener ('scroll', function() {do_something ('stringa1');}, false);' e successivamente 'window.removeEventListener ('scroll', function () {do_something ('stringa1');}, falso); 'e successivamente' window.addEventListener ('scroll', function() {do_something ('stringa2');}, false); ', ecc. – Bungle

+0

C'è un modo per aggiungere più listener di eventi utilizzando le chiusure (vedere http://stackoverflow.com/questions/2276961/is-there-for-window-on-load-in-javascript/2277000#2277000). Comunque suggerirei di usare jQuery se vuoi fare qualche seria gestione degli eventi. Lo rende molto più facile. –

3
var listener; 

listener = function(){ 

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

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

}; 

window.addEventListener('click', listener ,false); 
Problemi correlati