2013-11-04 7 views
7

これは基本的にはこれに続く質問です:Can't pass event to addEventListener: closure issueclosureを使って追加されたEventListenerを削除するには?

私はほとんどすべての関連する質問を読んでおり、これに対する答えを見つけることができません。

以下の関数は、データの配列からパラメータが引き出されるループ内で実行されます。 この関数では、イベントリスナーの各インスタンスに異なる/新しいパラメータを渡すことができます。外部関数は、パラメータの値をクロージャ内にカプセル化して、ホルダへの参照だけでなく、実際の値を利用できるようにします。さらに、パス機能関数は、イベントを応答関数に渡します。最後に、レスポンス関数には、クリックイベントに応答するためのすべての適切な情報が含まれています。これは素晴らしいです。 問題は、後でイベントリスナーを削除する方法がわかりません。私は考えることができるすべてを試しました。助けてください。どうやって:removeEventListener?

(function outerfunction(i, f) { 
    elementname.addEventListener("click", function passeventfunction(e) { 
     responsefunction(e, f, i); });})(parameter1, parameter2); 

また、誰かがここで起こっていることを解決するのに役立つ可能性がある場合。これはクロージャー内のクロージャーですか?メモリリークなどの危険性はありますか?ありがとう!あなたのリスナーへの参照を維持する必要があり

+0

あなたがremoveEventListener' 'にそれを渡すことができるようにどこかに' passeventfunction'への参照を保存する必要があります。 – Bergi

答えて

8

var listeners = {}; 
for(/* ... */) { 
    (function outerfunction(i, f) { 
     var listener = function(e) { 
      responsefunction(e, f, i); 
     } 
     elementname.addEventListener("click", listener); 
     listeners[elementname.id] = listener; // use something meaningful 
               // as your keys 
    })(parameter1, parameter2); 
} 

// Removing the listener later: 
elementname.removeEventListener("click", listeners[elementname.id]); 
関連する問題