无论如何要删除这样添加的事件侦听器:
element.addEventListener(event, function(){/* do work here */}, false);
不更换元素?
无论如何要删除这样添加的事件侦听器:
element.addEventListener(event, function(){/* do work here */}, false);
不更换元素?
除非您在创建时存储了对事件处理程序的引用,否则无法彻底删除事件处理程序。
我通常会将这些添加到该页面上的主对象中,然后您可以在完成该对象后迭代并干净地处理它们。
您可以像这样删除事件侦听器:
element.addEventListener("click", function clicked() {
element.removeEventListener("click", clicked, false);
}, false);
删除元素的所有事件侦听器的最简单方法是将其分配outerHTML
给自身。它的作用是通过 HTML 解析器发送 HTML 的字符串表示,并将解析后的 HTML 分配给元素。因为没有传递 JavaScript,所以不会有绑定的事件监听器。
document.getElementById('demo').addEventListener('click', function(){
alert('Clickrd');
this.outerHTML = this.outerHTML;
}, false);
<a id="demo" href="javascript:void(0)">Click Me</a>
一个警告是委托的事件侦听器,或父元素上的事件侦听器,它们监视每个与其子元素上的一组条件匹配的事件。解决这个问题的唯一方法是更改元素以使其不满足委托事件侦听器的标准。
document.body.addEventListener('click', function(e){
if(e.target.id === 'demo') {
alert('Clickrd');
e.target.id = 'omed';
}
}, false);
<a id="demo" href="javascript:void(0)">Click Me</a>
老问题,但这里有一个解决方案。
严格来说,除非您存储对该函数的引用,否则您无法删除匿名事件侦听器。由于使用匿名函数的目的大概不是创建一个新变量,您可以将引用存储在元素本身中:
element.addEventListener('click',element.fn=function fn() {
// Event Code
}, false);
稍后,当您想要删除它时,您可以执行以下操作:
element.removeEventListener('click',element.fn, false);
请记住,第三个参数 ( false
) 的值必须与添加事件侦听器的值相同。
然而,问题本身又引出了另一个问题:为什么?
使用.addEventListener()
而不是更简单的.onsomething()
方法有两个原因:
首先,它允许添加多个事件侦听器。在有选择地删除它们时,这会成为一个问题:您可能最终会命名它们。如果您想将它们全部删除,那么@tidy-giant 的outerHTML
解决方案非常好。
其次,您确实可以选择捕获事件而不是冒泡事件。
如果这两个原因都不重要,您很可能决定使用更简单的onsomething
方法。
您可以尝试覆盖element.addEventListener
并做任何您想做的事情。
就像是:
var orig = element.addEventListener;
element.addEventListener = function (type, listener) {
if (/dontwant/.test(listener.toSource())) { // listener has something i dont want
// do nothing
} else {
orig.apply(this, Array.prototype.slice.apply(arguments));
}
};
ps.:不推荐,但可以解决问题(尚未测试)