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”方法。。有办法解决这个问题吗?