Вы не можете удалить слушателя, если добавляете нового слушателя.Все слушатели будут добавлены в очередь.Вы можете увидеть это, например, здесь:
var listenerLoad = function(e){console.log(1)};
window.addEventListener('load', listenerLoad, false);
window.addEventListener('load', listenerLoad, true);
window.addEventListener('load', function(e){console.log(3)}, false);
window.onload = function(e){console.log(4)};
Но вы можете удалить слушателя, если используете для этого соответствующую функцию.Вы должны использовать функцию EventTarget.removeEventListener()
. Внимательно прочитайте эту документацию. Параметры должны быть такими же, как в addEventListener()
при инициализации из этих событий.И указатели на листы должны быть такими же, как в addEventListener()
.Например, если вы они имеют указатели на листеры, например:
var listenerTouchStart = function(e){/**/},
listenerTouchEnd = function(e){/**/},
listenerTouchCancel = function(e){/**/},
listenerTouchMove = function(e){/**/};
, то вы можете удалить слушателей следующим образом:
document.removeEventListener('touchstart', listenerTouchStart, false);
document.removeEventListener('touchend', listenerTouchEnd, false);
document.removeEventListener('touchcancel', listenerTouchCancel, false);
window.removeEventListener('touchmove', listenerTouchMove, false);
Но не забывайте, что window.removeEventListener('touchmove', listenerTouchMove, false);
и window.removeEventListener('touchmove', listenerTouchMove, true);
не одно и то же.Если они добавляют слушателя с помощью false
, а вы пытаетесь удалить его с помощью true
, тогда он не будет работать.Будьте осторожны!
Если вы хотите найти имена функций слушателя, у вас есть 3 способа:
- Вы можете искать вручную в коде.
- В консоль разработчика в Chrome DevTools (Opera inclusive), Safari Inspector и в Firebug вы можете набрать в консоли
getEventListeners(Object);
.Например, для нашего окна в первом примере у вас будет такой вывод:
И если слушатель был добавлен с анонимной функциейтогда у него нет имени.
Вы можете использовать скрипт ListenerTracker.Вот его исходный код (не пытайтесь выполнить этот фрагмент - он только скрывает этот длинный код):
// THIS SNIPPET SHOULD NOTHING DO.
// IT IS ONLY TO HIDE THIS LONG CODE
function DO_NOT_COPY_THIS_LINE() //<-DO NOT COPY THIS LINE
{
//////////////////////////////
//ListenerTracker Script START
//////////////////////////////
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();
//////////////////////////////
//ListenerTracker Script END
//////////////////////////////
}
Я нашел этот скрипт ListenerTracker здесь .С помощью этого сценария вы получите даже анонимных слушателей, но вы должны добавить его, прежде чем они добавят несколько слушателей в код.
Удачи!