删除侦听器时出现问题

时间:2018-01-22 02:06:08

标签: javascript event-handling

这是我现在正在努力的功能:

function close(ubicacion){
return function(){


    if ((event.target.className == 'contCurso') || (event.target.className == 'cerrar') || (window.event.keyCode == 27) ){

        closeWindow('contCurso', ubicacion); //se cierra el curso
        document.removeEventListener('click',close);
        document.removeEventListener('keydown',close);
    }
    else{
        console.log('Listener not removed');  } }}

close被称为来自另一个函数的处理程序,如下所示:

document.addEventListener('click', close(contCurso));  
document.addEventListener('keydown', close(contCurso)); 

不仅没有删除我想要的侦听器,而且它还删除了我在主要部分添加的一些不应删除的内容。

任何帮助都会非常感激。非常感谢!

1 个答案:

答案 0 :(得分:2)

当你致电document.addEventListener('click', close(contCurso));时,你正在评估函数close,它返回另一个作为监听器回调附加的函数。但是,当您尝试删除它时,您只是向它传递一个对函数close的引用,该函数附加的函数,因此不会删除任何内容。

如果要以这种方式附加事件监听器,则必须保存对所附原始函数的引用,以便以后能够将其删除:

let listener = close(contCurso);
document.addEventListener('click', listener);
...
document.removeEventListener('click', listener);

即使拨打removeEventListener('click', close(contCurso))也不够,因为它没有返回对同一功能的引用。