在添加侦听器的函数中声明/包含的函数中删除事件侦听器

时间:2019-02-28 04:46:17

标签: javascript removeeventlistener

这可能是一个非常愚蠢的问题,但我想了解其背后的原因。我为这个可怜的问题标题道歉。

以下代码有效。当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

0 个答案:

没有答案