removeEventListener en funciones anónimas en JavaScript
Tengo un objeto que tiene métodos. Estos métodos se colocan en el objeto dentro de una función anónima. Se parece a esto:
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);
};
});
(hay mucho más código, pero esto es suficiente para mostrar el problema)
Ahora quiero detener el detector de eventos en algunos casos. Por lo tanto, estoy intentando realizar un removeEventListener pero no sé cómo hacerlo. He leído en otras preguntas que no es posible llamar a removeEventListener en funciones anónimas, pero ¿es este también el caso en esta situación?
Tengo un método en t creado dentro de la función anónima y por eso pensé que era posible. Se ve como esto:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
¿Por qué no puedo hacer esto?
¿Hay alguna otra (buena) manera de hacer esto?
Información adicional; esto sólo tiene que funcionar en Safari, de ahí la falta de soporte para IE.
Puede nombrar la función pasada y usar el nombre en removeEventListener. como en:
button.addEventListener('click', function eventHandler() {
///this will execute only once
alert('only once!');
this.removeEventListener('click', eventHandler);
});
EDITAR:
Esto no funcionará si está trabajando en modo estricto ( "use strict";
)
EDITAR 2:
arguments.callee
ahora está en desuso ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments/callee )
Creo que ese es el objetivo de una función anónima, le falta un nombre o una forma de hacer referencia a ella.
Si yo fuera usted, simplemente crearía una función con nombre o la pondría en una variable para que tenga una referencia a ella.
var t = {};
var handler = function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
};
window.document.addEventListener("keydown", handler);
Luego puedes eliminarlo
window.document.removeEventListener("keydown", handler);
Una versión de la solución de Otto Nascarella que funciona en modo estricto es:
button.addEventListener('click', function handler() {
///this will execute only once
alert('only once!');
this.removeEventListener('click', handler);
});