Невозможно удалить EventListener
У меня есть класс TypeScript, который выглядит примерно так:
class MyClass {
let canvas: any;
constructor(canvas: any) {
this.canvas = canvas;
this.canvas.requestPointerLock = this.canvas.requestPointerLock;
document.exitPointerLock = document.exitPointerLock;
this.canvas.onclick = this._mouseClickHandler.bind(this);
document.addEventListener('pointerlockchange', this._togglePointerLock.bind(this), false);
}
private _mouseClickHandler(event: MouseEvent): void {
this.canvas.requestPointerLock();
}
private _togglePointerLock() {
if (document.pointerLockElement === this.canvas) {
console.info('Locked mouse pointer to canvas.');
document.addEventListener('mousemove', this._handleMouseMovement.bind(this), false);
} else {
console.info('Unlocked mouse pointer from canvas.');
// THIS DOES NOT WORK
document.removeEventListener('mousemove', this._handleMouseMovement.bind(this), false);
}
}
private _handleMouseMovement(event: MouseEvent) {
console.log('Mouse moved to: ', event.movementX, event.movementY);
}
}
В основном код должен регистрировать _handleMouseMovement
прослушиватель событий после того, как мышь была заблокирована на холсте, и удалите ее после снятия блокировки.
Блокировка работает. Активирует вход в систему _handleMouseMovement
но как только я снимаю блокировку через ESC
Я получаю сообщение Unlocked mouse pointer from canvas.
Так _handleMouseMovement
не удаляется и регистрация положения продолжается.
Я думаю, что я обратил внимание на то, чтобы не регистрировать анонимные функции, которые могут быть причиной такой проблемы. Поэтому мне интересно, что еще может быть причиной такого поведения.
1 ответ
.bind
создает новую функцию. Таким образом, ваше добавление и удаление не для той же функции.
исправлять
Не использовать.bind
и вместо этого используйте функции стрелок:
private _handleMouseMovement = (event: MouseEvent) => {
console.log('Mouse moved to: ', event.movementX, event.movementY);
}