1 回答

TA貢獻1831條經驗 獲得超9個贊
該.bind()方法返回一個新函數,因此您作為回調添加到的函數addEventListener是對您要刪除的函數的不同引用。因此,事件偵聽器不會被刪除。
您可以考慮像這樣在構造函數中進行綁定:
constructor() {
...
this.closeDesktopSearchMenu = this.closeDesktopSearchMenu.bind(this);
...
}
然后像這樣使用你的方法(沒有綁定,就像現在在構造函數中完成的那樣):
openDesktopSearchMenu() {
this.$desktopSearchMenu.style.height = '330px';
document.addEventListener('click', this.closeDesktopSearchMenu, true);
}
closeDesktopSearchMenu() {
this.$desktopSearchMenu.style.height = '0px';
document.removeEventListener('click', this.closeDesktopSearchMen, true);
}
請參閱下面的示例片段:
class Test {
constructor() {
this.prop = "bar";
this.foo = this.foo.bind(this);
}
foo() {
console.log('Foo', this.prop);
}
a() {
document.addEventListener('click', this.foo, true);
}
b() {
document.removeEventListener('click', this.foo, true);
}
}
const test = new Test();
console.log("Event listener added");
test.a();
setTimeout(() => {
console.log("Event listener removed");
test.b();
}, 3000);
添加回答
舉報