В любом случае, чтобы удалить прослушиватель событий, добавленный следующим образом:
element.addEventListener(event, function(){/* do work here */}, false);
без замены элемента?
В любом случае, чтобы удалить прослушиватель событий, добавленный следующим образом:
element.addEventListener(event, function(){/* do work here */}, false);
без замены элемента?
Невозможно очистить обработчик события, если вы не сохранили ссылку на обработчик события при создании.
Обычно я добавляю их к основному объекту на этой странице, после чего вы можете выполнять итерацию и очищать их, когда это делается с этим объектом.
Вы можете удалить прослушиватель событий следующим образом:
element.addEventListener("click", function clicked() {
element.removeEventListener("click", clicked, false);
}, false);
Самый простой способ удалить все прослушиватели событий для элемента - назначить его outerHTML
самому себе. Что это делает, это отправляет строковое представление HTML через анализатор HTML и назначает проанализированный HTML элементу. Поскольку JavaScript не передается, не будет прослушивателей связанных событий.
document.getElementById('demo').addEventListener('click', function(){
alert('Clickrd');
this.outerHTML = this.outerHTML;
}, false);
<a id="demo" href="javascript:void(0)">Click Me</a>
Вы можете попробовать перезаписать element.addEventListener
и сделать все, что хотите.
Что-то вроде:
var orig = element.addEventListener;
element.addEventListener = function (type, listener) {
if (/dontwant/.test(listener.toSource())) { // listener has something i dont want
// do nothing
} else {
orig.apply(this, Array.prototype.slice.apply(arguments));
}
};
ps: не рекомендуется, но он будет делать трюк (не проверял его)
Редактировать: Как Manngo предложил для комментария, вы должны использовать .off() вместо .unbind(), так как .unbind() устарел с jQuery 3.0 и заменен с jQuery 1.7.
Несмотря на то, что это старый вопрос, и в нем не упоминается jQuery, я опубликую свой ответ здесь, так как это первый результат для поискового запроса 'jquery remove anonymous event handler'.
Вы можете попробовать удалить его, используя функцию .off().
$('#button1').click(function() {
alert('This is a test');
});
$('#btnRemoveListener').click(function() {
$('#button1').off('click');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="button1">Click me</button>
<hr/>
<button id="btnRemoveListener">Remove listener</button>
Назначение обработчиков событий с литеральными функциями сложнее - не только нет способа их удалить, не клонируя node и не заменяя его клоном - вы также можете ненадлежащим образом назначить один и тот же обработчик несколько раз, что не может если вы используете ссылку на обработчик. Две функции всегда рассматриваются как два разных объекта, даже если они идентичны.
Вы можете попытаться удалить всех слушателей таким образом:
allClicks = getEventListeners(element).click
allClicks.forEach(function(el){el.remove()})
или вы можете удалить (например) только последнее добавленное событие
allClicks = getEventListeners(element).click
allClicks[allClicks.length-1].remove()
Старый вопрос, но здесь есть решение.
Строго говоря, вы не можете удалить анонимный прослушиватель событий, если не сохраните ссылку на функцию. Поскольку цель использования анонимной функции, по-видимому, не в том, чтобы создать новую переменную, вы можете вместо этого сохранить ссылку в самом элементе:
element.addEventListener('click',element.fn=function fn() {
// Event Code
}, false);
Позже, когда вы захотите удалить его, вы можете сделать следующее:
element.removeEventListener('click',element.fn, false);
Помните, что третий параметр (false
) должен иметь то же значение, что и для добавления прослушивателя событий.
Однако сам вопрос напрашивается другой: почему?
Есть две причины использовать .addEventListener()
а не простой .onsomething()
:
Во-первых, он позволяет добавлять несколько прослушивателей событий. Это становится проблемой, когда дело доходит до их выборочного удаления: вы, вероятно, в конечном итоге назовете их. Если вы хотите удалить их все, тогда решение @tidy-giants outerHTML
отлично.
Во-вторых, у вас есть возможность выбрать захват, а не всплывающее событие.
Если ни одна из причин не важна, вы можете решить использовать более onsomething
метод чего-либо.
Следующее работало достаточно хорошо для меня. Код обрабатывает случай, когда другое событие вызывает удаление слушателя из элемента. Нет необходимости в объявлениях функций заранее.
myElem.addEventListener("click", myFunc = function() { /*do stuff*/ });
/*things happen*/
myElem.removeEventListener("click", myFunc);
Если вы используете метод jQuery try off
$("element").off("event");
Метод JQuery.off() удаляет обработчики событий, которые были связаны с .on()