1

これは非常に人気のある質問のようですが、適切な回答が見つからなかったようです。

次のようにリッスンするイベントを添付します。

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

4 に答える 4

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それがあなたの意図だとは思えません。

于 2012-10-26T21:28:21.180 に答える
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
于 2012-10-26T21:29:16.280 に答える
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);
   }

})
于 2012-10-26T21:44:23.510 に答える
0
window.addEventListener('scroll', (function( e ){
   return fnName(e, some, param )
}), false)

を削除して、()定義後に直接実行しないようにするだけです

于 2012-10-26T21:27:15.597 に答える