我有一个按钮,我添加了一些事件列表到它:
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)怎么办?有什么办法吗,还是我得一个一个把它们去掉?
下面是一个同样基于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,那么您必须包装addEventListener函数并自行跟踪侦听器列表,就像下面的回答一样。
下面是一个同样基于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,那么您必须包装addEventListener函数并自行跟踪侦听器列表,就像下面的回答一样。