javascript - Como remover todos os listeners em um elemento?
Eu tenho um botão, e adicionei alguns eventlistners a ele:
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>
Eu posso removê-los por:
document.getElementById("btn").removeEventListener("click",funcA);
E se eu quiser remover todos os listeners de uma vez, ou eu não tiver a referência da função (funcA)? Existe uma maneira de fazer isso, ou eu tenho que removê-los um por um?
Resposta #1
Acho que a maneira mais rápida de fazer isso é simplesmente clonar o nó, o que removerá todos os ouvintes de eventos:
var old_element = document.getElementById("btn");
var new_element = old_element.cloneNode(true);
old_element.parentNode.replaceChild(new_element, old_element);
Apenas tenha cuidado, pois isso também limpará os ouvintes de eventos em todos os elementos filhos do nó em questão, então se você quiser preservar isso, terá que recorrer a remover os ouvintes explicitamente, um de cada vez.
Resposta #2
Se você estiver usando eventos do jQuery, isso pode ser feito em uma linha:
Para eventos jQuery (.on()):
$("#myEl").off()
Para eventos nativos do javascript (.addEventListener()):
$('#myEl').replaceWith($('#myEl').clone());
Aqui está um exemplo:
http://jsfiddle.net/LkfLezgd/3/
Resposta #3
Aqui está uma função que também é baseada em cloneNode, mas com uma opção para clonar apenas o nó pai e mover todos os filhos (para preservar os event listeners deles):
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);
}
}
Remover ouvintes de eventos em um elemento:
recreateNode(document.getElementById("btn"));
Remova os ouvintes de eventos em um elemento e em todos os seus filhos:
recreateNode(document.getElementById("list"), true);
Se você precisa manter o próprio objeto e, portanto, não pode usar cloneNode, então você tem que envolver a função addEventListener e rastrear a lista de listeners por conta própria, como nesta resposta.
