移除一个元素及其子元素的所有JavaScript事件监听器?

24

是否有可能删除元素及其子元素的所有事件监听器?例如:

myElem.removeEventListeners();

我需要这个是因为我有一个带有事件的复杂元素,而我需要创建它的副本 - 就像一个静态图像,不会触发任何事件。


1
首先,事件是如何绑定的(例如 onclick=...addEventListener、库等)? - Crescent Fresh
使用addEventListener()。它用于myElem以及根据用户触发的条件逻辑,用于一些任意子元素。 - Tower
5
我理解您不太关心使用“attachEvent”的IE浏览器,如果是这种情况,“复制”您的元素并使用cloneNode(true),神奇地添加事件监听器将不会被复制。这在规范中有说明:http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener - Crescent Fresh
2个回答

25
如果您使用cloneNode,则不会复制事件监听器。
如果您想要一个健壮的解决方案,最好的选择可能是编写一个包装器来attach/detach监听器,并自己跟踪它们。类似于Dean Edwards' addEvent这样的东西。

谢谢你的建议。我正在使用W3C事件监听器,所以我可能需要编写一个包装器,但我想避免这样做... - Tower
但是如果您使用cloneNode,则不会复制您的侦听器。请查看我的更新。 - gblazex
如果有一种简单的方法可以删除所有事件处理程序,那就太好了。 - nonopolarity
2
不幸的是,我无法在 window 对象中使用它。 - Tomáš Zato

-7

我不知道有没有,而且在谷歌上搜索也没有明显的结果。一个简单而笨拙的解决方案是创建一个函数,循环遍历每个事件并将其设置为null,例如:

function removeEvents(obj)
{
    obj.onblur = null;
    obj.onchange = null;
    obj.onclick = null;
    // ...
}

按照以下方式调用此函数:removeEvents(myElem)。完整的JavaScript事件处理程序列表可以在http://www.elated.com/articles/events-and-event-handlers/找到。

毫无疑问,有一种更优雅的编写此函数的方法,但我不知道是否有更优雅的解决此问题的方法。如果有人知道,请告诉我。如果您通过JavaScript库(如jQuery)绑定事件,则可能有其他更好的选项。


3
如果它仍然被调用,我会将其设置为空函数(function () {})。 - Casey Chu
7
这并没有解决问题,它只是在徒劳无益地浪费时间。 - Auri Rahimzadeh
5
有人抽出时间和精力离开了他平常的生活,并发表了一个回答,他做出了尝试,为什么要批评那个人。如果是错误的,那就是错误的。如果人们因提出建议而被踢出来,那么论坛怎么能成功呢?为什么不去批评所有那些靠你无价的答案寄生的人呢?对于明智地使用论坛的每个人,感谢你的努力,@TNi。 - Craig Wayne
1
@CraigWayne Stack Overflow不是一个论坛。 - Luke B.
2
这可能是您特定浏览器的可行解决方案。然而,在Linux上,最新版本(截至今天)的Firefox或Chromium并不起作用。它也没有在ECMAScript标准中记录为可能的解决方案,因此这不太可能成为许多人的工作解决方案。虽然我欣赏这个想法,但没有解释为什么这可能会起作用,这就是为什么它不是一个很好的解决方案的原因。因为解决方案只是猜测。我累了,可能说的话没有连贯性。 - L0j1k
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接