En JavaScript, quel est le meilleur moyen de supprimer une fonction ajoutée en tant qu'écouteur d'événements à l'aide de bind ()?
Exemple
(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 seule façon dont je peux penser est de garder une trace de chaque auditeur ajouté avec bind.
Exemple ci-dessus avec cette méthode:
(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);
};
})();
Existe-t-il de meilleures façons de procéder?
javascript
events
listener
bind
takfuruya
la source
la source
this.clickListener = this.clickListener.bind(this);
etthis.myButton.addEventListener("click", this.clickListener);
bindAll
fonction qui simplifie les méthodes de liaison. Dans votre initialiseur d'objet, il vous suffit_.bindAll(this)
de définir chaque méthode de votre objet sur une version liée. Sinon, si vous voulez seulement lier certaines méthodes (que je vous recommande, pour éviter les fuites de mémoire accidentelle), vous pouvez leur fournir comme arguments:_.bindAll(this, "foo", "bar") // this.baz won't be bound
.Réponses:
Bien que ce que @machineghost ait dit soit vrai, que les événements sont ajoutés et supprimés de la même manière, la partie manquante de l'équation était la suivante:
Voir Est - ce que bind () change la référence de la fonction? | Comment définir définitivement?
Donc, pour l'ajouter ou le supprimer, assignez la référence à une variable:
Cela fonctionne comme prévu pour moi.
la source
.addEventListener(type, listener)
et.removeEventListener(type, listener)
pour ajouter et supprimer des événements sur un élément. Pour les deux, vous pouvez transmettre la référence de fonction décrite dans la solution commelistener
paramètre, avec"click"
comme type. developer.mozilla.org/en-US/docs/Web/API/EventTarget/…Pour ceux qui rencontrent ce problème lors de l'enregistrement / de la suppression de l'auditeur du composant React dans / du magasin Flux, ajoutez les lignes ci-dessous au constructeur de votre composant:
la source
this.onChange = this.onChange.bind(this)
en fait c'est ce que je cherchais. La fonction liéethis
pour toujours :)Peu importe que vous utilisiez une fonction liée ou non; vous le supprimez de la même manière que tout autre gestionnaire d'événements. Si votre problème est que la version liée est sa propre fonction unique, vous pouvez soit garder une trace des versions liées, soit utiliser la
removeEventListener
signature qui ne prend pas de gestionnaire spécifique (bien que cela supprimera bien sûr d'autres gestionnaires d'événements du même type ).(En remarque,
addEventListener
cela ne fonctionne pas dans tous les navigateurs; vous devriez vraiment utiliser une bibliothèque comme jQuery pour faire vos connexions d'événements de manière inter-navigateurs pour vous. De plus, jQuery a le concept d'événements à espaces de noms, qui permettent vous devez vous lier à "click.foo"; lorsque vous voulez supprimer l'événement, vous pouvez dire à jQuery "supprimer tous les événements foo" sans avoir à connaître le gestionnaire spécifique ou à supprimer d'autres gestionnaires.)la source
off
ou à launbind
méthode. Pour supprimer tous les écouteurs d'un élément, vous devez les suivre à mesure qu'ils sont ajoutés (ce que jQuery ou d'autres bibliothèques peuvent faire pour vous).Solution jQuery:
la source
Nous avons eu ce problème avec une bibliothèque que nous ne pouvions pas changer. Interface utilisateur d'Office Fabric, ce qui signifiait que nous ne pouvions pas modifier la façon dont les gestionnaires d'événements étaient ajoutés. La façon dont nous l'avons résolu a consisté à écraser le
addEventListener
sur leEventTarget
prototype.Cela ajoutera une nouvelle fonction sur les objets
element.removeAllEventListers("click")
(article d'origine: Supprimer le gestionnaire de clic de la superposition de la boîte de dialogue de tissu )
la source
Voici la solution:
la source
peut utiliser environ ES7:
la source
Si vous souhaitez utiliser 'onclick', comme suggéré ci-dessus, vous pouvez essayer ceci:
J'espère que cela aide.
la source
Cela fait longtemps mais MDN a une super explication à ce sujet. Cela m'a aidé plus que les trucs ici.
MDN :: EventTarget.addEventListener - La valeur de "this" dans le gestionnaire
Il offre une excellente alternative à la fonction handleEvent.
Voici un exemple avec et sans liaison:
Un problème dans l'exemple ci-dessus est que vous ne pouvez pas supprimer l'écouteur avec bind. Une autre solution consiste à utiliser une fonction spéciale appelée handleEvent pour intercepter tous les événements:
la source