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

Javascript 添加一个带有多个参数的事件侦听器,稍后将其删除,javascript,event-listener,Javascript,Event Listener,这似乎是一个非常流行的问题,尽管我似乎没有找到任何恰当的答案 我附加一个事件,如下所示: window.addEventListener('scroll', fnName, false); 问题是fnName需要几个参数,因此我随后尝试使用 window.addEventListener('scroll', (function( e ){ return fnName(e, some, param ) }()), false) 但是window.removeEventListener不再

这似乎是一个非常流行的问题,尽管我似乎没有找到任何恰当的答案

我附加一个事件,如下所示:

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)

只需删除
()
,以避免在定义后直接执行每次声明匿名函数时,它都会创建一个新的函数实例。如果要删除现有函数,则需要保留函数实例的副本

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
作为第一个参数。我怀疑这是您的意图。

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

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

window.addEventListener('scroll', myFn, false); // Add event listener
window.removeEventListener('scroll', myFn, false); // Remove event listener
正如您可能注意到的,此代码会提醒
“a”

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

window.addEventListener('scroll', function( event ) {
   fnName(event, some, param );
}, false);
当scroll事件发出时,您可以使用自定义参数初始化
fnName


如前所述,如果要再次删除处理程序,则需要一个命名函数:

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

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

由于我处于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);
   }

})

您的第二个
addEventListener
也不应该工作,除非
fnName
返回一个函数。归根结底,如果要删除它,您需要保留被分配的实际处理程序。您的最后一个示例不起作用,因为您正在立即调用处理程序。但是,您也遇到了删除处理程序的相同问题,这正是OP所要求的。哦。。杰普。。。您还应该将代码转移到另一个函数(例如fnnameheloper)中,并设置/删除有意义的thisOk,尽管问题是事件附加在RequireJS模块的公开部分,因此返回{init:function(){…there}},我希望事件处理程序declareation作为“private”方法。。有办法解决这个问题吗?