添加具有多个参数的事件侦听器,稍后将其删除

时间:2012-10-26 21:23:54

标签: javascript event-listener

这似乎是一个非常受欢迎的问题,虽然我似乎没有找到任何有针对性的答案。

我附上一个事件,如:

window.addEventListener('scroll', fnName, false);

问题是fnName需要几个参数,所以我试过

window.addEventListener('scroll', (function( e ){
   return fnName(e, some, param )
}()), false)

然后window.removeEventListener不再起作用,所以我尝试了:

window.removeEventListener('scroll', (function( e ){
   return fnName(e, some, param )
}()), false)

4 个答案:

答案 0 :(得分:2)

每次声明匿名函数时,它都会创建一个新的函数实例。如果要删除现有函数,则需要保留函数实例的副本。

var temp = function () {
    fnName(e, some, param);
};
window.addEventListener('scroll', temp, false);
//elsewhere,
window.removeEventListener('scroll', temp, false);

我还应该注意使用

(function (e){
     return fnName(e, some, param)
}());

立即以fnName作为第一个参数调用undefined。我怀疑这是你的意图。

答案 1 :(得分:1)

您拥有的是自我初始化功能:

(function() { alert("a") })(); 

您可能会注意到此代码会提醒"a"

在您的函数中,然后初始化fnName。你要做的是:

window.addEventListener('scroll', function( event ) {
   fnName(event, some, param );
}, false);

当滚动事件发出时,您使用自定义参数初始化fnName


正如所指出的,如果你想再次删除处理程序,你需要一个命名函数:

function myFn( event ) {
   fnName(event, some, param );
}

window.addEventListener('scroll', myFn, false); // Add event listener
window.removeEventListener('scroll', myFn, false); // Remove event listener

答案 2 :(得分:0)

window.addEventListener('scroll', (function( e ){
   return fnName(e, some, param )
}), false)

只需删除()以避免在定义后直接执行

答案 3 :(得分:0)

由于我处于AMD模块架构中,并且我试图将事件处理程序维护为私有方法,我只想出了这个解决方案:

define(function(){

 var fnNmae = function( e ) {
   // i can now access fnName.param
 };

 return { 
   init : function() {
    fnName.param = {
      one : 1,
      two : 2
    }

   window.addEventListener('scroll', fnName, false);
   }

})