有没有办法删除像这样添加的事件监听器:
element.addEventListener(event, function(){/* do work here */}, false);
不替换元素?
有没有办法删除像这样添加的事件监听器:
element.addEventListener(event, function(){/* do work here */}, false);
不替换元素?
如果没有在创建时存储事件处理程序的引用,就没有办法干净地删除事件处理程序。
通常我会将这些添加到该页面上的主对象中,然后您可以迭代并在使用完该对象后进行清理。
addEventListener
在某些情况下返回undefined
。例如,在BroadcastChannel上下文中。 - BairDev您可以按照以下方法移除事件监听器:
element.addEventListener("click", function clicked() {
element.removeEventListener("click", clicked, false);
}, false);
arguments.callee
,而命名函数表达式应该可以很好地工作,所以我编辑了我的答案。 - icktoofayclicked
函数在其自身内部可见吗?我遇到了一些问题:https://dev59.com/67L3oIgBc1ULPQZFTXIK - shen这是一个老问题,但这里有一个解决方案。
严格来说,如果没有存储函数的引用,你无法移除匿名事件侦听器。由于使用匿名函数的目标可能不是创建一个新变量,因此你可以将引用存储在元素本身中:
element.addEventListener('click',element.fn=function fn() {
// Event Code
}, false);
稍后,当您想要将其删除时,可以执行以下操作:
element.removeEventListener('click',element.fn, false);
请记住,第三个参数(false
)必须与添加事件侦听器时的值相同。
然而,这个问题本身又引出了另一个问题:为什么?
使用 .addEventListener()
而不是更简单的 .onsomething()
方法有两个原因:
首先,它允许添加多个事件侦听器。当需要选择性地删除它们时会变成一个问题:你可能最终需要对它们进行命名。如果要全部删除,那么 @tidy-giant 的 outerHTML
解决方案是很好的选择。
其次,您可以选择捕获而不是冒泡事件。
如果这两个原因都不重要,那么您可能会决定使用更简单的 onsomething
方法。
删除元素所有事件监听器最简单的方法是将其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>
是的,您可以删除匿名事件监听器:
const controller = new AbortController();
document.addEventListener(
"click",
() => {
// do function stuff
},
{ signal: controller.signal }
);
controller.abort();
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));
}
};
备注:虽然不建议这样做,但它可以解决问题(未经测试)
EventTarget.prototype.addEventListener
。这对我有用。 - Lorcan O'Neill使用文字函数分配事件处理程序是棘手的- 不仅没有办法删除它们,而且必须克隆节点并用克隆替换它才能删除- 您还可能会意外多次分配相同的处理程序,如果使用处理程序的引用则不会发生此情况。两个函数始终被视为两个不同的对象,即使它们是字符完全相同的。
element.onmouseover=function
的语句无法工作,因为存在沙盒保护机制。请参阅http://commons.oreilly.com/wiki/index.php/Greasemonkey_Hacks/Getting_Started#Pitfall_.232:_Event_Handlers。 - Brock Adams$('#button1').click(function() {
alert('This is a test');
});
$('#btnRemoveListener').click(function() {
$('#button1').off('click');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="button1">Click me</button>
<hr/>
<button id="btnRemoveListener">Remove listener</button>
.off()
而不是.unbind()
。 - Manngo//get Event
let obj = window; //for example
let eventStr= "blur"; //for example
let index= 0; //you can console.log(getEventListeners(obj)[eventStr]) and check index
let e = getEventListeners(obj)[eventStr][index];
//remove this event
obj .removeEventListener(eventStr,e.listener,e.useCapture);
结束了 :)
我在Chrome 92中测试过,可以工作
off
方法。$("element").off("event");