栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Javascript / DOM:如何删除DOM对象的所有事件?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Javascript / DOM:如何删除DOM对象的所有事件?

我不确定 _删除 所有 事件_是什么意思。删除特定事件类型的所有处理程序还是删除一种类型的所有事件处理程序?

删除所有事件处理程序

如果要删除所有(任何类型的)事件处理程序,则可以克隆 该元素并将其替换为其克隆:

var clone = element.cloneNode(true);

注意: 这将保留属性和子项,但不会保留对DOM属性的任何更改。


删除特定类型的“匿名”事件处理程序

另一种方法是使用,

removeEventListener()
但我想您已经尝试过了,但是没有用。

addEventListener
每次调用匿名函数都会创建一个新的侦听器。调用
removeEventListener
匿名函数 无效
。匿名函数每次被调用时都会创建一个唯一的对象,尽管它可以调用一个对象,但它并不是对现有对象的引用。以这种方式添加事件侦听器时,请确保仅添加一次,它是永久的(无法删除),直到添加到它的对象被销毁为止。

您实质上是将匿名函数传递给

addEventListener
as
eventReturner
返回一个函数。

您可以通过两种方法解决此问题:

  1. 不要使用返回函数的函数。直接使用功能:
function handler() {dosomething();}div.addEventListener('click',handler,false);
  1. 为此创建一个包装,
    addEventListener
    该包装存储对返回的函数的引用,并创建一些奇怪的
    removeAllEvents
    函数:
var _eventHandlers = {}; // somewhere globalfunction addListener(node, event, handler, capture) {if(!(node in _eventHandlers)) {    // _eventHandlers stores references to nodes    _eventHandlers[node] = {};}if(!(event in _eventHandlers[node])) {    // each entry contains another entry for each event type    _eventHandlers[node][event] = [];}// capture reference_eventHandlers[node][event].push([handler, capture]);node.addEventListener(event, handler, capture);}function removeAllListeners(node, event) {if(node in _eventHandlers) {    var handlers = _eventHandlers[node];    if(event in handlers) {        var eventHandlers = handlers[event];        for(var i = eventHandlers.length; i--;) { var handler = eventHandlers[i]; node.removeEventListener(event, handler[0], handler[1]);        }    }}}

然后,您可以将其用于:

    addListener(div, 'click', eventReturner(), false)// and laterremoveAllListeners(div, 'click')

注意: 如果您的代码运行了很长时间,并且正在创建和删除许多元素,那么在

_eventHandlers
销毁它们时必须确保删除其中包含的元素。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/464615.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号