26

Lo siento si esta es una pregunta común, pero no pude encontrar ninguna respuesta que pareciera pertinente mediante la búsqueda.¿Cómo agrego y elimino un detector de eventos usando una función con parámetros?

Si hay que adjuntar un detector de eventos como éste:

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

no parece trabajar para tratar de quitarlo más adelante, así:

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

Supongo que esto se debe a la Los métodos addEventListener y removeEventListener quieren una referencia a la misma función, mientras les proporciono funciones anónimas que, aunque son idénticas en el código, no son literalmente las mismas.

¿Cómo puedo cambiar mi código para llamar al removeEventListener para trabajar? El argumento "caja" se refiere al nombre de un que estoy rastreando en la pantalla; es decir, quiero suscribirme al evento scroll una vez por cada que tengo (la cantidad varía), y una vez que la función check_pos() mide una posición determinada, llamará a otra función y también eliminará el detector de eventos para liberarlo hasta los recursos del sistema.

Mi corazonada es que la solución implicará un cierre y/o denominación de la función anónima, pero no estoy seguro exactamente de qué se trata, y agradecería un ejemplo concreto.

Espero que tenga sentido. ¡Gracias por cualquier ayuda!

Respuesta

14

¿Ha intentado mantener una referencia a la función anónima (como sugirió)?

Así:

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

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

documentos de Mozilla suggest la misma cosa.

+0

Gracias, Vivin - me corrija si estoy equivocado, pero yo no creo que esto me permitiría configurar varios detectores de eventos con diferentes valores para "caja", que es lo que tengo que hacer. El argumento "caja" no es una variable global. Por ejemplo, simplemente usando valores literales, podría llamar 'window.addEventListener ('scroll', function() {do_something ('string1');}, false);' y más tarde 'window.removeEventListener ('scroll', function () {do_something ('string1');}, false); 'y posterior' window.addEventListener ('scroll', function() {do_something ('string2');}, false); ', etc. – Bungle

+0

Hay un forma de agregar múltiples oyentes de eventos mediante el uso de cierres (Ver http://stackoverflow.com/questions/2276961/is-there-for-window-onload-in-javascript/2277000#2277000). Sin embargo, le sugiero que use jQuery si desea realizar un manejo de eventos serio. Lo hace mucho más fácil. –

3
var listener; 

listener = function(){ 

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

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

}; 

window.addEventListener('click', listener ,false); 
Cuestiones relacionadas