为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

元芳怎么了 2019-08-17 15:24:08
Javascript / DOM:如何删除DOM对象的所有事件?只是提问:有没有办法彻底删除对象的所有事件,例如div?编辑:我正在添加div.addEventListener('click',eventReturner(),false);一个事件。function eventReturner() {     return function() {         dosomething();     };}EDIT2:我找到了一种方法,但是不能用于我的情况:var returnedFunction;function addit() {     var div = document.getElementById('div');     returnedFunction = eventReturner();     div.addEventListener('click',returnedFunction,false); //You HAVE to take here a var and not the direct call to eventReturner(), because the function address must be the same, and it would change, if the function was called again.}function removeit() {     var div = document.getElementById('div');     div.removeEventListener('click',returnedFunction,false);}
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

我不确定你删除所有事件的意思。删除特定类型事件的所有处理程序或一种类型的所有事件处理程序?

删除所有事件处理程序

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

var clone = element.cloneNode(true);

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


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

另一种方法是使用,removeEventListener()但我想你已经尝试过这个并没有用。这是一个问题

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

您实际上是将一个匿名函数传递给addEventListeneras eventReturner返回一个函数。

您有两种可能性来解决这个问题:

  1. 不要使用返回函数的函数。直接使用该功能:

    function handler() {
        dosomething();}div.addEventListener('click',handler,false);
  2. 创建一个包装器,用于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 laterremoveListeners(div, 'click')

DEMO

注意:如果您的代码运行了很长时间并且您正在创建并删除大量元素,则必须确保在_eventHandlers销毁它们时删除其中包含的元素。


查看完整回答
反对 回复 2019-08-17
?
茅侃侃

TA贡献1842条经验 获得超21个赞

这将从子节点中删除所有侦听器,但对于大页面来说会很慢。写得非常简单。

element.outerHTML = element.outerHTML;


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 3832 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号