removeEventListener на анонимных функциях в JavaScript - PullRequest
83 голосов
/ 09 февраля 2011

У меня есть объект, в котором есть методы.Эти методы помещаются в объект внутри анонимной функции.Это выглядит так:

var t = {};
window.document.addEventListener("keydown", function(e) {
    t.scroll = function(x, y) {
        window.scrollBy(x, y);
    };
    t.scrollTo = function(x, y) {
        window.scrollTo(x, y);
    };
});  

(кода гораздо больше, но этого достаточно, чтобы показать проблему)

Теперь я хочу остановить прослушиватель событий в некоторых случаях.Поэтому я пытаюсь сделать removeEventListener, но я не могу понять, как это сделать.Я читал в других вопросах, что невозможно вызвать removeEventListener для анонимных функций, но так ли это в этой ситуации?

У меня есть метод в t, созданный внутри анонимной функции, и поэтому я подумалбыло возможноВыглядит так:

t.disable = function() {
    window.document.removeEventListener("keydown", this, false);
}

Почему я не могу это сделать?

Есть ли другой (хороший) способ сделать это?

Информация о бонусе;это должно работать только в Safari, отсюда и отсутствует поддержка.

Ответы [ 12 ]

0 голосов
/ 02 января 2018

Возможно, не лучшее решение с точки зрения того, что вы спрашиваете.Я до сих пор не определил эффективный метод удаления анонимной функции, объявленной inline с вызовом прослушивателя событий.

Я лично использую переменную для хранения <target> и объявления функции вне вызова слушателя событий, например:

const target = document.querySelector('<identifier>');

function myFunc(event) { function code;}

target.addEventListener('click', myFunc);

Затем удалить слушателя:

target.removeEventListener('click', myFunc);

Не самая главная рекомендация, которую вы получите, но удалить анонимфункции единственное решение, которое я нашел полезным, это удалить, а затем заменить элемент HTML.Я уверен, что должен быть лучший ванильный метод JS, но я еще не видел его.

0 голосов
/ 29 ноября 2013
window.document.onkeydown = function(){};
...