首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用addEventListener获取附加到节点的事件侦听器

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

Stack Overflow用户
提问于 2012-01-29 00:16:44
回答 5查看 149.2K关注 0票数 119

我已经看过这些问题了:

然而,它们都没有回答如何在创建事件侦听器之前不修改addEventListener原型的情况下,使用addEventListener获取附加到节点的事件侦听器列表。

VisualEvent不会显示所有的事件侦听器(特定于iphone的),我想通过编程来实现这一点。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-28 02:13:19

Chrome DevTools、Safari Inspector和Firebug都支持。

票数 153
EN

Stack Overflow用户

发布于 2012-04-05 22:42:54

你不能这么做。

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

DOM4 addEventListener

他说

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

这意味着事件监听器被添加到“事件监听器列表”中。就这样。不知道这个列表应该是什么,也不知道你应该如何访问它。

票数 74
EN

Stack Overflow用户

发布于 2016-02-06 08:29:43

由于没有本机方法可以做到这一点,下面是我找到的侵入性较小的解决方案(不要添加任何“旧的”原型方法):

代码语言:javascript
复制
var ListenerTracker=new function(){
    var targets=[];
    // listener tracking datas
    var _elements_  =[];
    var _listeners_ =[];
    this.init=function(){
        this.listen(Element,window);
    };
    this.listen=function(){
        for(var i=0;i<arguments.length;i++){
            if(targets.indexOf(arguments[i])===-1){
                targets.push(arguments[i]);//avoid duplicate call
                intercep_events_listeners(arguments[i]);
            }
        }
    };
    // 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(target){
        var _target=target;
        if(target.prototype)_target=target.prototype;
        if(_target.getEventListeners)return;
        if(typeof(_target.addEventListener)!=='function'||typeof(_target.removeEventListener)!=='function'){
            console.log('target=',target);
            throw('\nListenerTracker Error:\nUnwrappable target.');
        }
        // backup overrided methods
        var _super_={
            "addEventListener"      : _target.addEventListener,
            "removeEventListener"   : _target.removeEventListener
        };

        _target["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
            var uc=(typeof(useCapture)==='object'?useCapture.useCapture:useCapture)?1:0;
            if(!listeners[uc][type])listeners[uc][type]=[];
            listeners[uc][type].push({cb:listener,args:arguments});
        };
        _target["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=(typeof(useCapture)==='object'?useCapture.useCapture:useCapture)?1:0;
            if(!listeners[useCapture][type])return;
            var lid = listeners[useCapture][type].findIndex(obj=>obj.cb===listener);
            if(lid>-1)listeners[useCapture][type].splice(lid,1);
        };
        _target["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].cb,
                                "args":list[type][id].args,
                                "useCapture":!!useCapture
                            });
                        }
                    }
                }else{// all
                    for(var _type in list){
                        for(var id in list[_type]){
                            result.push({
                                "type":_type,
                                "listener":list[_type][id].cb,
                                "args":list[_type][id].args,
                                "useCapture":!!useCapture
                            });
                        }
                    }
                }
            }
            return result;
        };
    };

}();


ListenerTracker.init();

编辑

来自@mplungjan的建议:修改为侦听可包装的目标(singleton|构造函数)。‘'init’跟踪元素窗口

其他可包装目标的示例:

代码语言:javascript
复制
ListenerTracker.listen(XMLHttpRequest);

来自@kodfire的建议:您可以使用args属性获取可选参数。

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9046741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档