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

它们都没有回答如何使用创建连接到节点的事件侦听器的列表addEventListener,而不addEventListener在创建事件侦听器之前修改原型。


VisualEvent不会显示所有事件侦听器(特定于iPhone的事件侦听器),而我想(以某种方式)以编程方式执行此操作。


白衣非少年
浏览 535回答 3
3回答

ibeautiful

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

森栏

你不能获取所有附加到节点的事件侦听器列表的唯一方法是拦截侦听器附件调用。DOM4 addEventListener说将事件侦听器追加到事件侦听器的关联列表中,该事件侦听器的类型设置为type,将侦听器设置为侦听器,并将捕获设置为捕获,除非该列表中已经存在具有相同类型,侦听器和捕获的事件侦听器。意味着将事件侦听器添加到“事件侦听器列表”中。就这样。没有关于此列表应该是什么以及您应该如何访问它的概念。

BIG阳

由于没有本地方法可以执行此操作,因此我发现的侵入性较小(不要添加任何“旧”原型方法):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();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript