2009-06-29 47 views
7

我應該將每個data()調用與稍後的removeData()調用配對嗎?我的假設:jQuery的remove()將從DOM中移除元素,如果我沒有任何其他的移除引用,我不必再進行更多的清理。但是,如果我有一些JavaScript var或對象引用了其中一個被刪除的元素,我需要清理它,並且我假設也適用於jQuery的數據函數,因爲它是以某種方式引用元素。我應該用jQuery的數據()注意什麼樣的內存泄漏?

因此,如果我確實需要在刪除之前調用removeData,是否有快捷方式刪除與某個元素相關的所有數據,或者是否必須按名稱明確地調用它們?

編輯:我查看了源代碼並確認了Borgar和roosteronacid說的。 Remove從dom中取出元素並刪除與它們一起存儲的任何事件和數據 - 這很方便,但讓我想知道何時使用removeData()。可能不經常。

回答

14

jQuery的數據不會保留對元素的引用,因此您不需要擔心內存泄漏。其預期目的是解決這個確切的問題。

它是如何工作的輕微簡化:

一個id成員添加到每個「感動」 DOM節點。所有涉及該DOM元素的後續操作都使用該ID。

var theNode = document.getElementById('examplenode'); 
theNode[ 'jQuery' + timestamp ] = someInternalNodeID; 

您可以使用相同的功能jQuery使用訪問ID:

someInternalID = jQuery.data(document.body); 

當您將數據追加到它存儲的jQuery對象上,該節點的內部ID提交下的節點。你$(element).data(key,value)內部轉化爲類似:

jQuery.cache[ someInternalNodeID ][ theKey ] = theValue; 

一切都進入相同的結構,包括事件處理程序:

jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler; 

當一個元素被刪除,jQuery的可能因此丟掉所有的數據(和事件處理程序)與一種簡單的操作:

delete jQuery.cache[ someInternalNodeID ]; 

理論上,可能會因此也去除的jQuery不脫離的發生泄漏y引用。 jQuery甚至支持庫的多個單獨實例,每個實例都擁有自己的一組數據或事件。

你可以在the "The DOM Is a Mess" presentation看到John Resig解釋這個東西。

+5

讀者應該注意,這隻有在使用jQuery的`.remove()`方法時纔是安全的,這會導致存儲的數據被清理乾淨。如果你自己從DOM中刪除元素,jQuery不會知道清理它,並且在頁面關閉之前你將會有泄漏。 – 2012-07-10 20:42:06

0

總的來說,JavaScript知道何時適合收集垃圾是相當不錯的,除非您正在編寫非常大型或長時間運行的客戶端應用程序,否則我認爲涉及的內存大多數無關緊要,試圖猜測它並不會讓你受益匪淺。

確定jQuery中未完成的詞法關閉或其他棘手的javascript可能仍然訪問您給定的數據可能在某些情況下非常複雜。

據我所知,如果你存儲了對jQuery數據函數的任何引用,那麼在元素被刪除後繼續存在,因此刪除該引用也是必要的。一些簡單的測試用例會給你一個更確定的答案。

2

jQuery的整點是抽象從蹩腳JavaScript實現和錯誤在瀏覽器中..如內存泄漏:)

..燁遠;當元素從DOM中刪除時,所有與元素關聯的數據都將被刪除。