У меня есть объект, в котором есть методы. Эти методы помещаются в объект внутри анонимной функции. Выглядит это так:
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.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
Почему я не могу этого сделать?
Есть ли другой (хороший) способ сделать это?
Бонусная информация; это должно работать только в Safari, отсюда и отсутствие поддержки IE.
(Elem.setUserData('eventListener', function(e){console.log('Event fired.');}, null);
а затем выполните Elem.addEventListener ('event', Elem.getUserData ('eventListener'), false); ... и то же самое для removeEventListener. Надеюсь, ты это хорошо понимаешь.Ответы:
Я считаю, что в этом суть анонимной функции, у нее нет имени или способа ссылаться на нее.
На вашем месте я бы просто создал именованную функцию или поместил ее в переменную, чтобы у вас была ссылка на нее.
Затем вы можете удалить его с помощью
источник
this
Ключевое слово может сбивать с толку. Хорошее место, чтобы прочитать об этом - quirksmode.org/js/this.htmlthis
относится к элементу, к которому добавлен слушатель, а не к самому событию (которое будет параметромe
). Следовательноthis === e.currentTarget
. прочтите developer.mozilla.org/en-US/docs/Web/API/EventTarget/…если вы находитесь внутри самой функции, вы можете использовать arguments.callee в качестве ссылки на функцию. как в:
РЕДАКТИРОВАТЬ: это не сработает, если вы работаете в строгом режиме (
"use strict";
)источник
button.addEventListener('click', function handler() { this.removeEventListener('click', handler); });
Версия решения Отто Наскареллы , работающая в строгом режиме:
источник
Может быть несколько анонимных функций, keydown 1
Предупреждение: работает только в
Chrome Dev Tools
и не может использоваться в коде : ссылкаисточник
getEventListeners
похоже, является частью инструментов Chrome Dev, поэтому на самом деле не может использоваться ни для чего, кроме отладки.в современных браузерах вы можете сделать следующее ...
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
источник
Не такой уж анонимный вариант
С момента получения отзыва от Энди ( совершенно верно, но, как и во многих примерах, я хотел показать контекстное расширение идеи ), вот менее сложное изложение:
Это обеспечивает эффективную анонимную структуру функций, позволяет избежать использования практически устаревшего вызываемого объекта и позволяет легко удалить.
Между прочим : удаление элемента сценария сразу после установки слушателя - это симпатичный трюк для сокрытия кода, который, как хотелось бы, не был совершенно очевидным для посторонних глаз ( испортило бы сюрприз ;-)
Итак, метод ( проще ):
источник
Это не идеально, поскольку удаляет все, но может сработать для ваших нужд:
Node.cloneNode ()
источник
JavaScript : метод addEventListener регистрирует указанный слушатель в EventTarget (Element | document | Window), который он вызывает.
EventTarget. addEventListener ( тип_события , функция- обработчик , всплывание | захват );
События мыши, клавиатуры Пример теста в WebConsole:
Метод removeEventListener удаляет прослушиватель событий, ранее зарегистрированный с помощью EventTarget.addEventListener ().
могу ли я использовать
источник
Чтобы дать более современный подход к этому:
источник
Я наткнулся на ту же проблему, и это было лучшее решение, которое я мог получить:
Имейте в виду, что я тестировал это только для
window
элемента и для'mousemove'
события, поэтому при таком подходе могут возникнуть некоторые проблемы.источник
Возможно, не лучшее решение с точки зрения того, о чем вы спрашиваете. Я до сих пор не определил эффективный метод удаления анонимной функции, объявленной встроенной при вызове прослушивателя событий.
Я лично использую переменную для хранения
<target>
и объявления функции вне вызова прослушивателя событий, например:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Затем, чтобы удалить слушателя:
target.removeEventListener('click', myFunc);
Это не самая лучшая рекомендация, которую вы получите, но для удаления анонимных функций единственное решение, которое я нашел полезным, - это удалить, а затем заменить элемент HTML. Я уверен, что должен быть лучший ванильный JS-метод, но я его еще не видел.
источник
Я знаю, что это довольно старая ветка, но подумал, что могу вложить свои два цента для тех, кто сочтет ее полезной.
Скрипт (извиняюсь за некреативные названия методов):
И вы можете использовать это так:
источник
источник
addEventListener
.