Допустим хотим поставить обработчик события, и снять его тут же:
let button = document.getElementById('button');
function func() {
console.log('Сработало');
}
button.addEventListener('click', func);
button.removeEventListener('click', func);
<button id="button">Кликни</button>
Прекрасно, func не сработал.
Но что будет, если в обработчике есть функции с this?
let button = document.getElementById('button');
let objWithFunc = {
func() {
console.log('Сработало');
},
start() {
function auxiliaryFunc() {
this.func();
}
// Воспользуемся .bind(this) иначе будет ошибка
button.addEventListener('click', auxiliaryFunc.bind(this));
// Ни один из следующих методов не снимет обработчик
button.removeEventListener('click', auxiliaryFunc);
button.removeEventListener('click', auxiliaryFunc.bind(this));
}
}
objWithFunc.start();
<button id="button">Кликни</button>
Как снять обработчик в этом случае?
.bind()
создаёт новую функцию. Именно её, а не созданную новую, нужно передавать в removeEventListener
const listener = auxiliaryFunc.bind(this)
button.addEventListener('click', listener);
button.removeEventListener('click', listener);
Немного не по теме, но можно обойтись и без .bind(this)
в реалиях es6.
const button = document.getElementById('button');
const objWithFunc = {
func() {
console.log('Сработало');
},
start() {
const auxiliaryFunc = () => {
this.func();
}
button.addEventListener('click', auxiliaryFunc);
button.removeEventListener('click', auxiliaryFunc);
}
}
objWithFunc.start();
<button id="button">Кликни</button>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день! Нужна помощь знающих, который день мучаю пагинацию на Bootstrap в Angular-приложении, но не могу понять как заставить правильно работать...
Одно фото попадает в слайдер, все остальные выводятся отдельноПодскажите пожалуйста