我有一个按钮。单击此按钮时,我会做两件事
打开搜索菜单
将事件侦听器附加到文档主体以侦听关闭事件。
但是,我似乎无法从关闭函数的文档中删除事件监听器。也就是说,我第二次尝试打开菜单时,它会立即调用关闭功能
我的问题是...
如何删除文档事件侦听器?我该怎么做,如果用户点击搜索菜单,它就不会触发文档点击事件
openDesktopSearchMenu() {
this.$desktopSearchMenu.style.height = '330px';
document.addEventListener('click', this.closeDesktopSearchMenu.bind(this), true);
}
closeDesktopSearchMenu() {
this.$desktopSearchMenu.style.height = '0px';
document.removeEventListener('click', this.closeDesktopSearchMenu.bind(this), true);
}
7 月 24 日更新 尼克的回答绝对让我朝着正确的方向前进。但是,由于捕获参数,文档总是首先被调用。因此,如果用户在搜索菜单中单击,它会自动关闭。
删除捕获参数会导致在打开后立即调用关闭函数。
对我有用的解决方法是在添加时将侦听器包装在超时内。然后自然地我不得不在搜索菜单上调用 stopPropagation() 单击
searchMenuClick = (e) => {
e.stopPropagation();
}
/** open the desktop search menu */
openDesktopSearchMenu = () => {
this.$desktopSearchMenu.style.height = '330px';
this.$navBar.classList.add('search');
setTimeout(() => {
document.addEventListener('click', this.closeDesktopSearchMenu, { capture: false });
});
}
closeDesktopSearchMenu = () => {
this.$desktopSearchMenu.style.height = '0px';
setTimeout(() => {
this.$navBar.classList.remove('search');
}, 300);
document.removeEventListener('click', this.closeDesktopSearchMenu, { capture: false });
}
天涯尽头无女友
相关分类