2010-03-15 79 views
15

我有點困惑jQuery如何用.data()函數存儲數據。jQuery如何使用.data()存儲數據?

這是什麼叫做expando? 或者這是使用HTML5網絡存儲,但我認爲這不太可能?

文檔說:

的。數據()方法允許我們任何類型的DOM元素的數據附加的方式,是從循環引用安全並因此從存儲器泄漏。

當我讀到expando時,它似乎有內存泄漏的風險。不幸的是,我的技能不足以閱讀和理解jQuery代碼本身,但我想知道jQuery如何使用data()存儲這些數據。

回答

16

基本上,jQuery擁有您在data(name, value)/data(name)中存儲/檢索的信息,並在名爲cache的內部javascript對象中使用removeData(name)刪除。剩下的只是一點javascript魔術,讓它工作並保持所有的關聯。

哦,並回答你的問題的第一部分。它既不是expando也不是HTML5 WebStorage。

爲了糾正我自己,我認爲jQuery在一次使用expando。它爲您使用data()的那些元素設置了一個屬性來存儲信息。屬性名稱看起來像這樣

"jQuery" + now() //e.g. jQuery1268647073375 

btw。 now()是一個內部函數,它返回(new Date).getTime()

並且值是由jQuery生成的UUID

這種方式後來jQuery可以從它的內部緩存中檢索正確的關聯數據。

因此,如果您擔心IE中的expando,我記得您不能刪除它們,那麼泄漏應該是最小的,因爲jQuery只使用您存儲數據的每個元素的1個expando。除非你上的元素字面上1000調用data()我看不出有什麼記憶問題

1

功能datajQuery.fn.extend使用此語句,保存提供可變:

jQuery.cache[ id ][ name ] = data; 

jQuery.cache只是一個標準的對象,定義爲cache: {}, jQuery的命名空間的內部。

因此,回答你的問題 - 我相信jQuery將數據存儲在稱爲cache的標準內部JavaScript對象中。

呵呵,關於你的內存泄漏問題 - 我真的不知道。如果JavaScript有一些麻煩存儲對標準JS對象的DOM元素的引用,這可能是一個問題。

+0

這是什麼版本。在1.4.2中沒有這樣的路線? – jitter 2010-03-15 09:51:27

+0

它來自http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js – rochal 2010-03-15 09:52:14

+1

順便說一句,即使jQuery 1.4.2使用內部對象稱爲緩存,所以asnwer仍然有效。語法略有不同,但答案相同。 – rochal 2010-03-15 09:54:11

-4

其放入高速緩存由瀏覽器本地很像一個cookie

 from jquery uncompressed: 

if (data !== undefined) { 
      thisCache[ name ] = data; 
     } 
0

還檢查了metadata plugin - 它從一個DOM元素提取元數據並將其作爲對象返回(在註釋here中討論)。

相關問題