removeEventListener en funciones anónimas en JavaScript

Resuelto bitkid asked hace 13 años • 18 respuestas

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.

bitkid avatar Feb 10 '11 03:02 bitkid
Aceptado

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 )

Otto Nascarella avatar Jul 16 '2012 20:07 Otto Nascarella

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);   
Adam Heath avatar Feb 09 '2011 21:02 Adam Heath

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);
});
Melle avatar Dec 27 '2016 10:12 Melle