Как удалить обработчик события?

Вот есть класс (а вот фидл):
class ProgressBar {
    constructor(wrapper, line) {
    	this.wrapper = wrapper;
        this.line    = line;
    
    	wrapper.addEventListener('mousemove', this.listener.bind(this, [line]));
        wrapper.removeEventListener('mousemove', this.listener);
    }
    
    listener([line], event) {
    	line.style.width = event.clientX + 'px'
    }
}


По сути ползунок не должен работать, так как я сразу удаляю обработчик, но это не так. Как же правильно удалить слушателя?
  • Вопрос задан
  • 283 просмотра
Решения вопроса 2
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
Если в объекте используется всего 1 событие (или все события допустимо обрабатывать одним обработчиком), то можно обойтись без bind и прочих хитростей по сохранению контекста:
class ProgressBar {
    constructor(wrapper, line) {
    	this.wrapper = wrapper;
        this.line    = line;

        // передаем объект а не функцию оО
    	wrapper.addEventListener('mousemove', this);
        wrapper.removeEventListener('mousemove', this);
    }

    // что бы использовать объект в качестве слушателя,
    // у него должен быть метод handleEvent - именно он будет получать события
    handleEvent(event) {
    	this.line.style.width = event.clientX + 'px'
    }
}

https://developer.mozilla.org/ru/docs/Web/API/Even...
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Байнд создаёт новую функцию, а удаляете вы старую. Вынесите байндинг в отдельную переменную и передайте в *EvenListener её.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы