Suppression d'un écouteur d'événements anonyme

Est-il de toute façon à supprimer un écouteur d'événement ajoutée comme ceci:

element.addEventListener(event, function(){/* do work here */}, false);

sans remplacer l'élément?

35
demandé sur erikvold 2010-06-24 05:04:00

11 réponses

il n'y a aucun moyen de supprimer proprement un gestionnaire d'événements à moins que vous n'ayez stocké une référence au gestionnaire d'événements à la création.

je vais généralement ajouter ceux-ci à l'objet principal sur cette page, alors vous pouvez itérer et proprement se débarrasser d'eux lorsqu'il est fait avec cet objet.

16
répondu Joe 2012-04-25 20:18:51

Vous pourriez enlever l'écouteur d'événement comme ceci:

element.addEventListener("click", function clicked() {
    element.removeEventListener("click", clicked, false);
}, false);
13
répondu icktoofay 2015-03-23 07:43:54

Anonyme lié écouteurs d'événement

la façon la plus simple de supprimer tous les écouteurs d'événements pour un élément est d'attribuer son outerHTML à lui-même. Ce que cela fait est d'envoyer une représentation de chaîne de caractères du HTML par L'intermédiaire de L'analyseur HTML et assigne le HTML analysé à l'élément. Comme aucun JavaScript n'est passé, il n'y aura pas d'écouteurs d'événements liés.

document.getElementById('demo').addEventListener('click', function(){
    alert('Clickrd');
    this.outerHTML = this.outerHTML;
}, false);
<a id="demo" href="javascript:void(0)">Click Me</a>

Anonyme déléguée événement les auditeurs

la seule mise en garde est les écouteurs d'événements délégués, ou les écouteurs d'événements sur un élément parent qui surveillent chaque événement correspondant à un ensemble de critères sur ses enfants. Le seul moyen de passer qui est de modifier l'élément pour ne pas répondre aux critères de l'auditeur délégué d'événement.

document.body.addEventListener('click', function(e){
    if(e.target.id === 'demo') {
        alert('Clickrd');
        e.target.id = 'omed';
    }
}, false);
<a id="demo" href="javascript:void(0)">Click Me</a>
8
répondu Tiny Giant 2015-09-27 16:06:38

vous pouvez essayer d'écraser element.addEventListener et faire ce que vous voulez.

quelque Chose comme:

var orig = element.addEventListener;

element.addEventListener = function (type, listener) {
    if (/dontwant/.test(listener.toSource())) { // listener has something i dont want
        // do nothing
    } else {
        orig.apply(this, Array.prototype.slice.apply(arguments));
    }
};

ps.: il n'est pas recommandé, mais il fera l'affaire (ne l'ai pas testé)

4
répondu w35l3y 2012-04-26 03:40:54

assigner des gestionnaires d'événements avec des fonctions littérales est délicat - non seulement il n'y a aucun moyen de les enlever, sans cloner le noeud et le remplacer par le clone - vous pouvez également assigner par inadvertance le même gestionnaire plusieurs fois, ce qui ne peut pas se produire si vous utilisez une référence à un gestionnaire. Deux fonctions sont toujours traitées comme deux objets différents, même si elles sont identiques.

1
répondu kennebec 2010-06-24 01:49:17

même si c'est une vieille question et qu'elle ne mentionne pas jQuery, je posterai ma réponse ici car c'est le premier résultat pour le terme de recherche 'jquery enlever anonyme gestionnaire d'événement'.

vous pouvez essayer de le supprimer en utilisant le unbind fonction.

$('#button1').click(function() {
       alert('This is a test');
});

$('#btnRemoveListener').click(function() {
       $('#button1').unbind('click');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="button1">Click me</button>
<hr/>
<button id="btnRemoveListener">Remove listener</button>

cependant cela ne fonctionne que si vous avez ajouté l'écouteur en utilisant jQuery-pas .la méthode addEventListener

Trouvé cette ici.

1
répondu general64 2018-03-11 23:31:30

Vieille Question, mais voici une solution.

à proprement parler, vous ne pouvez pas supprimer un écouteur d'événement anonyme à moins de stocker une référence à la fonction. Puisque le but de l'utilisation d'une fonction anonyme n'est probablement pas de créer une nouvelle variable, vous pourriez plutôt stocker la référence dans l'élément lui-même:

element.addEventListener('click',element.fn=function fn() {
    //  Event Code
}, false);

plus tard, quand vous voulez l'enlever, vous pouvez faire ce qui suit:

element.removeEventListener('click',element.fn, false);

Rappelez-vous, le troisième paramètre (false) doit avoir le valeur comme pour ajouter L'écouteur D'événement.

cependant, la question elle-même en soulève une autre: pourquoi?

Il y a deux raisons à utiliser .addEventListener() plutôt que le plus simple .onsomething() méthode:

tout d'Abord, il permet d' plusieurs écouteurs d'événement à ajouter. Cela devient un problème quand il s'agit de les enlever sélectivement: vous finirez probablement par les nommer. Si vous voulez tous les enlever, alors @tidy-giant est outerHTML la solution est excellent.

Deuxièmement, vous avez la possibilité de choisir de capturer plutôt que de la bulle de l'événement.

si aucune des deux raisons n'est importante, vous pouvez bien décider d'utiliser le plus simple onsomething méthode.

1
répondu Manngo 2018-07-08 03:35:31

Vous pouvez essayer de supprimer tous les auditeurs de cette façon:

allClicks = getEventListeners(element).click
allClicks.forEach(function(el){el.remove()})

ou vous pouvez supprimer (par exemple) que de dernier événement

allClicks = getEventListeners(element).click
allClicks[allClicks.length-1].remove()
0
répondu user2274573 2014-11-24 15:10:34

ce qui suit a assez bien fonctionné pour moi. Le code gère le cas où un autre événement déclenche la suppression de l'auditeur de l'élément. Aucune déclaration de fonction préalable n'est nécessaire.

myElem.addEventListener("click", myFunc = function() { /*do stuff*/ });

/*things happen*/

myElem.removeEventListener("click", myFunc);
-1
répondu Ice101781 2016-03-25 17:31:37

si vous utilisez jQuery, essayez off méthode

$("element").off("event");
-1
répondu uingtea 2016-10-03 18:18:32

Jquery .la méthode off() supprime les gestionnaires d'événements qui étaient attachés avec .sur()

-1
répondu Compunction 2017-12-03 18:09:14