Javascript removeEventListener无法正常工作 - 事件侦听器仍然存在

时间:2013-05-20 14:31:39

标签: javascript events event-listener

我已经看了几个方法,但我无法说清楚,我的代码是:

lb = document.body;

if(lb.addEventListener){    
    lb.addEventListener('keyup',
    function(event){
        keyPress(event.keyCode)
    }, false);
}

//In another function.

if(document.body.removeEventListener){
    document.body.removeEventListener('keyup', function(event){event.keyCode}, false);
} 

删除代码无效,尚未尝试过大量解决方案,但它是我脚本上的最后一件事,我只想完成它。

谢谢大家

3 个答案:

答案 0 :(得分:4)

调用removeEventListener时,必须为其提供相同的函数实例而不是addEventListener:

var lb = document.body;

var callback = function(event){
    keyPress(event.keyCode)
};

if(lb.addEventListener){    
    lb.addEventListener('keyup', callback, false);
}

//In another function.

if(document.body.removeEventListener){
    document.body.removeEventListener('keyup', callback, false);
}

由于namespaced events feature

,jQuery可以更轻松地处理这个问题
$(lb).on('keyup.my_namespace', function () { ... })

// later

$(lb).off('keyup.my_namespace');

答案 1 :(得分:1)

您无法使用removeEventListener删除匿名函数,而是使用函数名称。 e.g:

if(lb.addEventListener){    
    lb.addEventListener('keyup', myFunction, false);
}

//In another function.

if(document.body.removeEventListener){
    document.body.removeEventListener('keyup', myFunction, false);
} 

新功能:

function myFunction(e){
    var keyCode = e.keyCode;

}

答案 2 :(得分:1)

您需要命名处理程序函数,以便以后在删除侦听器时引用它:

lb.addEventListener('keyup', 
function keyup(event){ // assigns the handler to "keyup"
    keyPress(event.keyCode)
}, false);

document.body.removeEventListener('keyup', keyup, false);