2013-11-04 41 views
7

這基本上是一個後續問題:Can't pass event to addEventListener: closure issue如何使用closure添加removeEventListener?

我已經閱讀了幾乎所有相關的問題,但無法找到答案。

下面的函數在參數從數據數組中拉出的循環中執行。 有了這個函數,我可以將不同的/新的參數傳遞給事件監聽器的每個實例。 outerfunction允許將參數的值封裝在閉包中,以便實際值可用,而不僅僅是對持有者的引用。另外,passeventfunction將事件傳遞給響應函數。最後,響應函數具有所有適當的信息以響應點擊事件。這很好。 問題是,我想不出如何在以後刪除事件監聽器。我嘗試了所有我能想到的。請幫忙。我怎麼能:removeEventListener?

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

此外,如果有人可以幫助清理這裏發生的事情。這是閉合內的閉合嗎?是否有遺漏內存泄漏的危險?謝謝!

+0

您需要保存爲'passeventfunction'參考的地方,這樣可以傳遞到'removeEventListener'。 – 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]);