removeEventListener не работает

Я не знаю, что я делаю неправильно, но вот пример того, что я делаю, и, похоже, это не работает.

someDom.addEventListener('mousemove',function(ev) {self.onInputMove(ev)},false);

someDom.removeEventListener('mousemove',self.onInputMove);

Код removeEventListener выполняется, но он просто не удаляет прослушиватель mousemove.


person fogy    schedule 28.04.2011    source источник


Ответы (4)


removeEventListener удаляет прослушиватель, который точно соответствует добавленной функции.

В этом случае функция, которую добавил addEventListener, была:

var some_func = function(ev) {
    self.onInputMove(ev);
};

Сохраните ссылку на фактическую функцию, и все будет хорошо. Так, например, должно работать следующее:

someDom.addEventListener('mousemove',self.onInputMove,false);

someDom.removeEventListener('mousemove',self.onInputMove,false);
person Sean Vieira    schedule 28.04.2011
comment
Третий аргумент removeEventListener также является обязательным, поэтому ваш пример должен быть: someDom.removeEventListener('mousemove', self.onInputMove, false); - person meouw; 29.04.2011
comment
Я знаю, что опоздал на несколько лет, но третий аргумент на самом деле не является обязательным, верно? Я думаю, что это должно быть необязательным, и по умолчанию оно должно быть ложным. - person Michael Martin-Smucker; 02.12.2016
comment
Когда-то это было, но теперь это не является обязательным. Я оставлю это там просто для ясности, но хорошая мысль. - person Sean Vieira; 04.12.2016
comment
пожалуйста, объясните о третьем параметре в removeEventListener? и мне нужно использовать true в качестве третьего параметра в addEventListener, чтобы я мог предотвратить щелчки мышью по умолчанию... (открытие ссылки), поэтому я не могу установить false для этого метода.. - person user924; 11.11.2017
comment
Если вы используете true как для add, так и для removeEventListener, это будет работать - основная проблема заключается в том, что добавляемая функция должна быть той же функцией, что и удаляемая функция. - person Sean Vieira; 12.11.2017

onInputMove не является методом обратного вызова события. Итак, вам нужно сделать что-то вроде:

var event = function(ev) {self.onInputMove(ev)};
someDom.addEventListener('mousemove', event,false);

someDom.removeEventListener('mousemove', event, false);
person cem    schedule 28.04.2011
comment
Третий аргумент removeEventListener также является обязательным, поэтому ваш пример должен быть: someDom.removeEventListener('mousemove', event, false); - person meouw; 29.04.2011
comment
event не подходит для ссылки на функцию обработчика событий. - person UpTheCreek; 29.11.2012

Зачем делать это так сложно, просто используйте следующее, чтобы привязать событие к элементу:

element.onmousemove = function(e) {
    // Some code here...
    alert("Mouse moved!");
};

Теперь, когда вы хотите удалить событие, просто сделайте следующее:

element.onmousemove = null;

Сделанный!

Надеюсь, это поможет вам, ребята!

person Steffen Brem    schedule 12.07.2012
comment
Это должно было быть помечено как ответ. Доброго времени суток вам добрый господин. Ты только что спас меня. - person thandasoru; 26.02.2013
comment
@thandasoru нет, если вы используете прослушиватели событий. - person Sir; 04.11.2013
comment
Потому что в качестве парадигмы свойств используются старые обработчики событий, а не стандарт событий DOM уровня 2. И потому что этот метод не позволяет использовать несколько обработчиков одного события. - person Scott Marcus; 11.03.2016
comment
Кроме того, он не позволяет указать захват, пузырек или другие параметры. - person Manngo; 22.07.2016

Эта страница появляется первой при поиске этой/подобной проблемы в Google. Итак, помимо уже упомянутых ответов, вот еще один интересный факт на будущее:

Отсутствие третьей необязательной переменной в addEventListener() для useCapture/useBubble (поскольку по умолчанию она имеет значение false) создает некоторые проблемы при удалении того же прослушивателя событий с тем же именем обратного вызова. Я столкнулся с этой проблемой при работе с хромом. Чего не скажешь о других браузерах.

Поэтому явно укажите третью переменную как «false».

person daksh_019    schedule 30.09.2014