我有點困惑jQuery如何用.data()
函數存儲數據。jQuery如何使用.data()存儲數據?
這是什麼叫做expando? 或者這是使用HTML5網絡存儲,但我認爲這不太可能?
文檔說:
的。數據()方法允許我們任何類型的DOM元素的數據附加的方式,是從循環引用安全並因此從存儲器泄漏。
當我讀到expando時,它似乎有內存泄漏的風險。不幸的是,我的技能不足以閱讀和理解jQuery代碼本身,但我想知道jQuery如何使用data()
存儲這些數據。
我有點困惑jQuery如何用.data()
函數存儲數據。jQuery如何使用.data()存儲數據?
這是什麼叫做expando? 或者這是使用HTML5網絡存儲,但我認爲這不太可能?
文檔說:
的。數據()方法允許我們任何類型的DOM元素的數據附加的方式,是從循環引用安全並因此從存儲器泄漏。
當我讀到expando時,它似乎有內存泄漏的風險。不幸的是,我的技能不足以閱讀和理解jQuery代碼本身,但我想知道jQuery如何使用data()
存儲這些數據。
基本上,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()
我看不出有什麼記憶問題
功能data
在jQuery.fn.extend
使用此語句,保存提供可變:
jQuery.cache[ id ][ name ] = data;
jQuery.cache
只是一個標準的對象,定義爲cache: {},
jQuery的命名空間的內部。
因此,回答你的問題 - 我相信jQuery將數據存儲在稱爲cache
的標準內部JavaScript對象中。
呵呵,關於你的內存泄漏問題 - 我真的不知道。如果JavaScript有一些麻煩存儲對標準JS對象的DOM元素的引用,這可能是一個問題。
其放入高速緩存由瀏覽器本地很像一個cookie
from jquery uncompressed:
if (data !== undefined) {
thisCache[ name ] = data;
}
還檢查了metadata plugin - 它從一個DOM元素提取元數據並將其作爲對象返回(在註釋here中討論)。
這是什麼版本。在1.4.2中沒有這樣的路線? – jitter 2010-03-15 09:51:27
它來自http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js – rochal 2010-03-15 09:52:14
順便說一句,即使jQuery 1.4.2使用內部對象稱爲緩存,所以asnwer仍然有效。語法略有不同,但答案相同。 – rochal 2010-03-15 09:54:11