这可能是一个非常愚蠢的问题,但我想了解其背后的原因。我为这个可怜的问题标题道歉。
以下代码有效。当btn元素具有mousedown事件时,将显示一个菜单,并添加事件侦听器以隐藏文档中任何位置的mousedown事件的菜单。如果在显示菜单时单击btn,则不会再次添加事件,而是通过调用功能clear将其删除。因此,一点都没什么特别的。
我不理解并浪费大量时间的是,如果在menu_func中声明了clear函数,则在第二次btn mousedown事件发生时,不会删除文档上的事件侦听器。 (通过我的意思是,只需将menu_func的右大括号移到clear函数的右大括号之后。)将调用clear函数并执行其余代码,但是直到文档具有鼠标后,事件监听器才会被删除。 down事件,然后记录多个已删除的事件侦听器消息。
如果没有任何内容写入控制台日志,则可能会认为该代码可以以任何一种方式工作,但实际上并没有。
请在这里说明我不了解的内容。谢谢。
btn.addEventListener( 'mousedown', menu_func, false );
function menu_func(evt) {
evt.stopPropagation();
let e = evt.currentTarget;
if ( e.disp ) {
clear();
}
else {
document.addEventListener( 'mousedown', clear, false );
e.disp = true;
/* Some CSS style code to display menu. */
console.log('Event Listener Added');
}; // end if
} // close menu_func
function clear() {
document.removeEventListener( 'mousedown', clear, false );
e.disp = false;
/* Some CSS style code to remove menu. */
console.log('Event Listener Removed');
} // close clear