En JavaScript, ¿cuál es la mejor manera de eliminar una función agregada como detector de eventos mediante bind ()?
Ejemplo
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
La única forma en que puedo pensar es hacer un seguimiento de cada oyente agregado con bind.
Ejemplo anterior con este método:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
¿Hay alguna forma mejor de hacer esto?
javascript
events
listener
bind
takfuruya
fuente
fuente
this.clickListener = this.clickListener.bind(this);
ythis.myButton.addEventListener("click", this.clickListener);
bindAll
función que simplifica los métodos de enlace. Dentro de su inicializador de objetos solo_.bindAll(this)
debe configurar cada método de su objeto en una versión enlazada. Como alternativa, si sólo desea enlazar algunos métodos (que recomiendo, para evitar fugas accidentales de memoria), se les puede proporcionar como argumentos:_.bindAll(this, "foo", "bar") // this.baz won't be bound
.Respuestas:
Aunque lo que @machineghost dijo era cierto, que los eventos se agregan y eliminan de la misma manera, la parte faltante de la ecuación fue esta:
Ver ¿Bind () cambia la referencia de función? El | ¿Cómo configurar permanentemente?
Entonces, para agregarlo o eliminarlo, asigne la referencia a una variable:
Esto funciona como se esperaba para mí.
fuente
.addEventListener(type, listener)
y.removeEventListener(type, listener)
para agregar y eliminar eventos en un elemento. Para ambos, puede pasar la referencia de función descrita en la solución comolistener
parámetro, con"click"
como tipo. developer.mozilla.org/en-US/docs/Web/API/EventTarget/…Para aquellos que tienen este problema al registrar / eliminar el oyente del componente React a / desde la tienda Flux, agregue las líneas a continuación al constructor de su componente:
fuente
this.onChange = this.onChange.bind(this)
En realidad esto es lo que estaba buscando. La función atadathis
para siempre :)No importa si usa una función enlazada o no; lo elimina de la misma manera que cualquier otro controlador de eventos. Si su problema es que la versión enlazada es su propia función única, puede realizar un seguimiento de las versiones enlazadas o utilizar el
removeEventListener
firma que no tiene un controlador específico (aunque, por supuesto, eliminará otros controladores de eventos del mismo tipo )(Como nota al margen,
addEventListener
no funciona en todos los navegadores; realmente debería usar una biblioteca como jQuery para hacer sus conexiones de eventos en un navegador cruzado para usted. Además, jQuery tiene el concepto de eventos con espacios de nombres, que permiten se debe vincular a "click.foo"; cuando desee eliminar el evento, puede decirle a jQuery "eliminar todos los eventos foo" sin tener que conocer el controlador específico o eliminar otros controladores).fuente
off
o en elunbind
método. Para eliminar todos los oyentes en un elemento, debe realizar un seguimiento de ellos a medida que se agregan (que es algo que jQuery u otras bibliotecas pueden hacer por usted).Solución jQuery:
fuente
Tuvimos este problema con una biblioteca que no pudimos cambiar. Office Fabric UI, lo que significa que no pudimos cambiar la forma en que se agregaron los controladores de eventos. La forma en que lo resolvimos fue sobrescribir
addEventListener
elEventTarget
prototipo.Esto agregará una nueva función en los objetos
element.removeAllEventListers("click")
(publicación original: Eliminar el controlador de clic de la superposición de diálogo de la tela )
fuente
Aquí está la solución:
fuente
puede usar sobre ES7:
fuente
Si desea usar 'onclick', como se sugirió anteriormente, puede intentar esto:
Espero que ayude.
fuente
Ha pasado un tiempo, pero MDN tiene una súper explicación sobre esto. Eso me ayudó más que las cosas aquí.
MDN :: EventTarget.addEventListener - El valor de "this" dentro del controlador
Da una gran alternativa a la función handleEvent.
Este es un ejemplo con y sin enlace:
Un problema en el ejemplo anterior es que no puede eliminar el oyente con bind. Otra solución es usar una función especial llamada handleEvent para capturar cualquier evento:
fuente