这似乎是一个非常受欢迎的问题,虽然我似乎没有找到任何有针对性的答案。
我附上一个事件,如:
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)
答案 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);
}
})