J'ai un bouton et j'y ai ajouté quelques eventlistners
:
document.getElementById("btn").addEventListener("click", funcA, false);
document.getElementById("btn").addEventListener("click", funcB, false);
document.getElementById("btn").addEventListener("click", funcC, false);
document.getElementById("btn").addEventListener("blur" , funcD, false);
document.getElementById("btn").addEventListener("focus", funcE, false);
<button id="btn">button</button>
Je peux les enlever par:
document.getElementById("btn").removeEventListener("click",funcA);
Et si je veux, je veux supprimer tous les écouteurs en même temps, ou je n'ai pas la référence de la fonction (funcA
)? Y a-t-il un moyen de le faire ou dois-je les supprimer un par un?
Je pense que le moyen le plus rapide de faire est de simplement cloner le nœud, ce qui supprimera tous les écouteurs d'événements:
var old_element = document.getElementById("btn");
var new_element = old_element.cloneNode(true);
old_element.parentNode.replaceChild(new_element, old_element);
Faites simplement attention, car cela effacera également les écouteurs d'événement sur tous les éléments enfants du nœud en question. Par conséquent, si vous souhaitez conserver cette information, vous devrez recourir à la suppression explicite des écouteurs, un à la fois.
Si vous n’êtes pas opposé à jquery, vous pouvez le faire en une seule ligne:
jQuery 1.7 +
$("#myEl").off()
jQuery <1.7
$('#myEl').replaceWith($('#myEl').clone());
Voici un exemple:
Voici une fonction également basée sur cloneNode
, mais avec une option permettant de cloner uniquement le nœud parent et de déplacer tous les enfants (afin de préserver leurs écouteurs d'événement):
function recreateNode(el, withChildren) {
if (withChildren) {
el.parentNode.replaceChild(el.cloneNode(true), el);
}
else {
var newEl = el.cloneNode(false);
while (el.hasChildNodes()) newEl.appendChild(el.firstChild);
el.parentNode.replaceChild(newEl, el);
}
}
Supprimer les écouteurs d'événement sur un élément:
recreateNode(document.getElementById("btn"));
Supprimer des écouteurs d'événement sur un élément et tous ses enfants:
recreateNode(document.getElementById("list"), true);
Si vous devez conserver l'objet lui-même et ne pouvez donc pas utiliser cloneNode
, vous devez alors envelopper la fonction addEventListener
et suivre vous-même la liste des écouteurs, comme dans cette réponse =.