Der*_*會功夫 187 javascript javascript-events addeventlistener
我有一个按钮,我添加了一些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>
Run Code Online (Sandbox Code Playgroud)
我可以删除它们:
document.getElementById("btn").removeEventListener("click",funcA);
Run Code Online (Sandbox Code Playgroud)
如果我想要立即删除所有侦听器,或者我没有函数reference(funcA
),该怎么办?有没有办法做到这一点,或者我必须逐个删除它们?
Ben*_*n D 167
我认为最快的方法是克隆节点,这将删除所有事件侦听器:
var old_element = document.getElementById("btn");
var new_element = old_element.cloneNode(true);
old_element.parentNode.replaceChild(new_element, old_element);
Run Code Online (Sandbox Code Playgroud)
请注意,因为这也会清除所讨论节点的所有子元素上的事件侦听器,因此如果您想要保留它,则必须一次一个地显式删除侦听器.
Duk*_*uke 37
如果您不反对jquery,可以在一行中完成:
jQuery 1.7+
$("#myEl").off()
Run Code Online (Sandbox Code Playgroud)
jQuery <1.7
$('#myEl').replaceWith($('#myEl').clone());
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
http://jsfiddle.net/LkfLezgd/3/
use*_*ser 11
这是一个也基于的函数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);
}
}
Run Code Online (Sandbox Code Playgroud)
删除一个元素上的事件侦听器:
recreateNode(document.getElementById("btn"));
Run Code Online (Sandbox Code Playgroud)
删除元素及其所有子元素上的事件侦听器:
recreateNode(document.getElementById("list"), true);
Run Code Online (Sandbox Code Playgroud)
如果你需要保留对象本身而不能使用cloneNode
,那么你必须自己包装addEventListener
函数并跟踪监听器列表,就像在这个答案中一样.
归档时间: |
|
查看次数: |
161734 次 |
最近记录: |