Как удалить все прослушиватели в элементе? [дубликат]
этот вопрос уже есть ответ здесь:
- 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 ответа:
Я думаю, что самый быстрый способ сделать это - просто клонировать узел, который удалит все прослушиватели событий:
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());
вот пример:
вот функция, которая также основана на
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
, то вы должны обернуть