3 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
Chrome DevTools,Safari Inspector和Firebug支持getEventListeners(node)。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
你不能
獲取所有附加到節(jié)點(diǎn)的事件偵聽(tīng)器列表的唯一方法是攔截偵聽(tīng)器附件調(diào)用。
DOM4 addEventListener
說(shuō)
將事件偵聽(tīng)器追加到事件偵聽(tīng)器的關(guān)聯(lián)列表中,該事件偵聽(tīng)器的類(lèi)型設(shè)置為type,將偵聽(tīng)器設(shè)置為偵聽(tīng)器,并將捕獲設(shè)置為捕獲,除非該列表中已經(jīng)存在具有相同類(lèi)型,偵聽(tīng)器和捕獲的事件偵聽(tīng)器。
意味著將事件偵聽(tīng)器添加到“事件偵聽(tīng)器列表”中。就這樣。沒(méi)有關(guān)于此列表應(yīng)該是什么以及您應(yīng)該如何訪(fǎng)問(wèn)它的概念。

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
由于沒(méi)有本地方法可以執(zhí)行此操作,因此我發(fā)現(xiàn)的侵入性較?。ú灰砑尤魏巍芭f”原型方法):
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();
添加回答
舉報(bào)