我看到通過.on()
註冊的事件處理程序存放在$.cache
中。 我還看到事件處理程序也在$(elem).data()
中。
保存在$.cache
中的對象是指事件被註冊的DOM節點。當DOM節點分離時,這導致內存泄漏,並且這使得.off()
調用是強制性的。
我有一種情況,我不知道DOM節點(我附加的事件處理程序)何時被分離。雖然我可以在我的代碼中保存對該DOM節點的引用,並調用.off()
進行清理,但這看起來不太好,因爲知道何時刪除DOM節點並不簡單。
這樣做的最好方法是什麼?
1.如果元素和處理程序之間的關係是通過序列號維護的(如果處理程序沒有引用元素),我沒有看到.cache條目導致內存的原因泄漏。出於某種原因,我不知道它有多合理,緩存條目指的是元素。 我很想知道爲什麼需要引用元素。 2.我不知道元素的expando無法直接保存對對象(處理程序)的引用的情況。如果expando可以容納引用,我並不需要像.cache這樣的並行結構來保存引用。 – user968903 2012-02-16 04:42:25
@ user968903:1.如果您不使用刪除元素時刪除相關的$ .cache條目的jQuery方法,它們只會導致泄漏。序列號是兩者之間唯一的連接,所以如果帶有序列號爲'123'的元素被刪除,但jQuery不會刪除'$ .cache'中的條目'123',那麼該條目現在指的是不再包含數據有一個相應的元素,並且永遠不會被清理。理由是潛在的內存泄漏主要存在於IE6和IE7中。現在,這些瀏覽器幾乎消失了,我不知道這種方法是否好。 – 2012-02-16 14:32:41
@ user968903:2.我認爲現代瀏覽器通常會在刪除元素時進行清理,所以它可能不再是一個問題。我認爲主要是IE6/7有問題。我認爲關於閉包仍然存在潛在的內存泄漏,其中一個元素有一個處理程序在其變量範圍內有一個循環引用,但我不確定這是否是今天的問題。我會看看我能找到什麼。 – 2012-02-16 14:37:20