Как удалить все прослушиватели в элементе? [дубликат]


этот вопрос уже есть ответ здесь:

  • Javascript / DOM: Как удалить все события объекта DOM? 7 ответов

у меня есть кнопка, и я добавил 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>

Я могу удалить их:

document.getElementById("btn").removeEventListener("click",funcA);

что делать, если я хочу, я хочу, чтобы удалить все слушатели сразу, или у меня нет функции ссылка (funcA)? Есть ли способ сделать это, или я должен удалить их один за другим?

3 133

3 ответа:

Я думаю, что самый быстрый способ сделать это - просто клонировать узел, который удалит все прослушиватели событий:

var old_element = document.getElementById("btn");
var new_element = old_element.cloneNode(true);
old_element.parentNode.replaceChild(new_element, old_element);

просто будьте осторожны, так как это также очистит прослушиватели событий на всех дочерних элементах рассматриваемого узла, поэтому, если вы хотите сохранить это, вам придется прибегнуть к явному удалению прослушивателей по одному.

Если вы не против jQuery, это можно сделать в одну строку:

jQuery 1.7+

$("#myEl").off()

jQuery

$('#myEl').replaceWith($('#myEl').clone());

вот пример:

http://jsfiddle.net/LkfLezgd/3/

вот функция, которая также основана на cloneNode, но с возможностью клонировать только родительский узел и переместить все дочерние узлы (чтобы сохранить их прослушиватели событий):

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);
  }
}

удалить прослушиватели событий на одном элементе:

recreateNode(document.getElementById("btn"));

удалить прослушиватели событий для элемента и всех его дочерних элементов:

recreateNode(document.getElementById("list"), true);

Если вам нужно сохранить сам объект и поэтому не может использовать cloneNode, то вы должны обернуть