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

使用addEventListener获取附加到节点的事件侦听器

使用addEventListener获取附加到节点的事件侦听器

白衣非少年 2019-12-18 16:41:27
它们都没有回答如何使用创建连接到节点的事件侦听器的列表addEventListener,而不addEventListener在创建事件侦听器之前修改原型。VisualEvent不会显示所有事件侦听器(特定于iPhone的事件侦听器),而我想(以某种方式)以编程方式执行此操作。
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

Chrome DevTools,Safari Inspector和Firebug支持getEventListeners(node)。


查看完整回答
反对 回复 2019-12-18
?
森栏

TA贡献1810条经验 获得超5个赞

你不能


获取所有附加到节点的事件侦听器列表的唯一方法是拦截侦听器附件调用。


DOM4 addEventListener



将事件侦听器追加到事件侦听器的关联列表中,该事件侦听器的类型设置为type,将侦听器设置为侦听器,并将捕获设置为捕获,除非该列表中已经存在具有相同类型,侦听器和捕获的事件侦听器。


意味着将事件侦听器添加到“事件侦听器列表”中。就这样。没有关于此列表应该是什么以及您应该如何访问它的概念。


查看完整回答
反对 回复 2019-12-18
?
BIG阳

TA贡献1859条经验 获得超6个赞

由于没有本地方法可以执行此操作,因此我发现的侵入性较小(不要添加任何“旧”原型方法):


var ListenerTracker=new function(){

    var is_active=false;

    // listener tracking datas

    var _elements_  =[];

    var _listeners_ =[];

    this.init=function(){

        if(!is_active){//avoid duplicate call

            intercep_events_listeners();

        }

        is_active=true;

    };

    // register individual element an returns its corresponding listeners

    var register_element=function(element){

        if(_elements_.indexOf(element)==-1){

            // NB : split by useCapture to make listener easier to find when removing

            var elt_listeners=[{/*useCapture=false*/},{/*useCapture=true*/}];

            _elements_.push(element);

            _listeners_.push(elt_listeners);

        }

        return _listeners_[_elements_.indexOf(element)];

    };

    var intercep_events_listeners = function(){

        // backup overrided methods

        var _super_={

            "addEventListener"      : HTMLElement.prototype.addEventListener,

            "removeEventListener"   : HTMLElement.prototype.removeEventListener

        };


        Element.prototype["addEventListener"]=function(type, listener, useCapture){

            var listeners=register_element(this);

            // add event before to avoid registering if an error is thrown

            _super_["addEventListener"].apply(this,arguments);

            // adapt to 'elt_listeners' index

            useCapture=useCapture?1:0;


            if(!listeners[useCapture][type])listeners[useCapture][type]=[];

            listeners[useCapture][type].push(listener);

        };

        Element.prototype["removeEventListener"]=function(type, listener, useCapture){

            var listeners=register_element(this);

            // add event before to avoid registering if an error is thrown

            _super_["removeEventListener"].apply(this,arguments);

            // adapt to 'elt_listeners' index

            useCapture=useCapture?1:0;

            if(!listeners[useCapture][type])return;

            var lid = listeners[useCapture][type].indexOf(listener);

            if(lid>-1)listeners[useCapture][type].splice(lid,1);

        };

        Element.prototype["getEventListeners"]=function(type){

            var listeners=register_element(this);

            // convert to listener datas list

            var result=[];

            for(var useCapture=0,list;list=listeners[useCapture];useCapture++){

                if(typeof(type)=="string"){// filtered by type

                    if(list[type]){

                        for(var id in list[type]){

                            result.push({"type":type,"listener":list[type][id],"useCapture":!!useCapture});

                        }

                    }

                }else{// all

                    for(var _type in list){

                        for(var id in list[_type]){

                            result.push({"type":_type,"listener":list[_type][id],"useCapture":!!useCapture});

                        }

                    }

                }

            }

            return result;

        };

    };

}();

ListenerTracker.init();


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信