В JavaScript, каков наилучший способ удалить функцию, добавленную в качестве прослушивателя событий, с помощью bind ()?
пример
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.myButton.addEventListener("click", this.clickListener.bind(this));
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", ___________);
};
})();
Единственный способ, о котором я могу думать, - это отслеживать каждого слушателя, добавленного с помощью bind.
Пример выше с этим методом:
(function(){
// constructor
MyClass = function() {
this.myButton = document.getElementById("myButtonID");
this.clickListenerBind = this.clickListener.bind(this);
this.myButton.addEventListener("click", this.clickListenerBind);
};
MyClass.prototype.clickListener = function(event) {
console.log(this); // must be MyClass
};
// public method
MyClass.prototype.disableButton = function() {
this.myButton.removeEventListener("click", this.clickListenerBind);
};
})();
Есть ли лучшие способы сделать это?
javascript
events
listener
bind
takfuruya
источник
источник
this.clickListener = this.clickListener.bind(this);
иthis.myButton.addEventListener("click", this.clickListener);
bindAll
функцию, которая упрощает методы привязки. Внутри вашего инициализатора объекта вы просто_.bindAll(this)
устанавливаете для каждого метода в вашем объекте привязанную версию. С другой стороны , если вы только хотите , чтобы связать некоторые методы (которые я рекомендовал бы, чтобы предотвратить случайные утечки памяти), вы можете предоставить их в качестве аргументов:_.bindAll(this, "foo", "bar") // this.baz won't be bound
.Ответы:
Хотя то, что сказал @machineghost, было правдой, события добавляются и удаляются одинаково, но отсутствующей частью уравнения было следующее:
См. Bind () изменяет ссылку на функцию? | Как установить постоянно?
Итак, чтобы добавить или удалить его, присвойте ссылку на переменную:
Это работает, как и ожидалось для меня.
источник
.addEventListener(type, listener)
и.removeEventListener(type, listener)
для добавления и удаления событий в элементе. Для обоих вы можете передать ссылку на функцию, описанную в решении, какlistener
параметр,"click"
а в качестве типа. developer.mozilla.org/en-US/docs/Web/API/EventTarget/…Для тех, у кого есть эта проблема при регистрации / удалении слушателя компонента React в / из хранилища Flux, добавьте строки ниже в конструктор вашего компонента:
источник
this.onChange = this.onChange.bind(this)
на самом деле это то, что я искал. Функцияthis
всегда на связи :)Неважно, используете ли вы связанную функцию или нет; вы удаляете его так же, как и любой другой обработчик событий. Если ваша проблема заключается в том, что связанная версия представляет собой собственную уникальную функцию, вы можете либо отслеживать связанные версии, либо использовать
removeEventListener
подпись, которая не принимает определенный обработчик (хотя, конечно, это приведет к удалению других обработчиков событий того же типа). ).(Как примечание:
addEventListener
не работает во всех браузерах; вам действительно нужно использовать библиотеку, такую как jQuery, чтобы выполнять привязки событий кросс-браузерным способом для вас. Кроме того, jQuery имеет концепцию событий в пространстве имен, которая позволяет вам нужно привязать к «click.foo»; когда вы хотите удалить событие, вы можете сказать jQuery «удалить все события foo» без необходимости знать конкретный обработчик или удалять другие обработчики.)источник
off
илиunbind
методе. Чтобы удалить всех слушателей в элементе, вы должны отслеживать их по мере их добавления (что может сделать jQuery или другие библиотеки для вас).Решение jQuery:
источник
У нас была эта проблема с библиотекой, которую мы не могли изменить. Пользовательский интерфейс Office Fabric, что означало, что мы не могли изменить способ добавления обработчиков событий. То, как мы решили это, было переписать
addEventListener
наEventTarget
прототипе.Это добавит новую функцию на объекты
element.removeAllEventListers("click")
(Исходное сообщение: Удалить обработчик кликов из наложения диалогового окна ткани )
источник
Вот решение:
источник
можно использовать про ES7:
источник
Если вы хотите использовать «onclick», как предложено выше, вы можете попробовать это:
Я надеюсь, что это помогает.
источник
Это было некоторое время, но у MDN есть супер объяснение этому. Это помогло мне больше, чем вещи здесь.
MDN :: EventTarget.addEventListener - значение this в обработчике
Это дает отличную альтернативу функции handleEvent.
Это пример с и без привязки:
Проблема в приведенном выше примере заключается в том, что вы не можете удалить слушателя с помощью bind. Другое решение - использовать специальную функцию handleEvent для перехвата любых событий:
источник