যেহেতু এটি করার কোনও নেটিভ উপায় নেই, তাই এখানে আমি খুঁজে পেয়েছি এমন কম অনুপ্রবেশজনক সমাধান (কোনও 'পুরানো' প্রোটোটাইপ পদ্ধতি যুক্ত করবেন না):
var ListenerTracker=new function(){
var is_active=false;
var _elements_ =[];
var _listeners_ =[];
this.init=function(){
if(!is_active){
intercep_events_listeners();
}
is_active=true;
};
var register_element=function(element){
if(_elements_.indexOf(element)==-1){
var elt_listeners=[{},{}];
_elements_.push(element);
_listeners_.push(elt_listeners);
}
return _listeners_[_elements_.indexOf(element)];
};
var intercep_events_listeners = function(){
var _super_={
"addEventListener" : HTMLElement.prototype.addEventListener,
"removeEventListener" : HTMLElement.prototype.removeEventListener
};
Element.prototype["addEventListener"]=function(type, listener, useCapture){
var listeners=register_element(this);
_super_["addEventListener"].apply(this,arguments);
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);
_super_["removeEventListener"].apply(this,arguments);
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);
var result=[];
for(var useCapture=0,list;list=listeners[useCapture];useCapture++){
if(typeof(type)=="string"){
if(list[type]){
for(var id in list[type]){
result.push({"type":type,"listener":list[type][id],"useCapture":!!useCapture});
}
}
}else{
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();