我对jQuery如何使用.data()
函数存储数据感到有些困惑。
这是什么叫 expando ? 或者这是否使用HTML5 Web Storage,虽然我认为这不太可能?
文档说:
.data()方法允许我们以一种不受循环引用和内存泄漏安全的方式将任何类型的数据附加到DOM元素。
当我读到有关expando时,它似乎存在内存泄漏的风险。不幸的是,我的技能不足以阅读和理解jQuery代码本身,但我想知道jQuery如何使用data()
存储这些数据。
答案 0 :(得分:18)
基本上,jQuery使用data(name, value)/data(name)
保存您存储/检索的信息,并在名为removeData(name)
的内部javascript对象中使用cache
删除。其余的只是一些javascript魔术,使其工作并保持所有关联正确。
哦,回答你问题的第一部分。它既不是expando也不是HTML5 WebStorage。
为了纠正自己,我认为jQuery确实在一次使用expando。它为您使用data()
开启的元素设置一个属性,以便向其存储信息。属性名称如下所示
"jQuery" + now() //e.g. jQuery1268647073375
顺便说一句。 now()
是一个返回(new Date).getTime()
,该值是jQuery生成的UUID
。
这样jQuery以后就可以从它的内部缓存中检索正确的关联数据。
因此,如果你担心IE中的expando,我记得你无法删除它们,那么泄漏应该是最小的,因为jQuery每个元素只使用1个expando存储数据。除非你在几千个元素上调用data()
,否则我认为没有内存问题
答案 1 :(得分:1)
data
中的函数jQuery.fn.extend
正在使用此语句来保存提供的变量:
jQuery.cache[ id ][ name ] = data;
jQuery.cache
只是一个标准对象,在jQuery名称空间内定义为cache: {},
。
回答你的问题 - 我相信jQuery将数据存储在名为cache
的标准内部JavaScript对象中。
哦,关于你的内存泄漏问题 - 我真的不知道。如果JavaScript在标准JS对象中存储对DOM元素的引用存在一些麻烦,这可能是一个问题。
答案 2 :(得分:0)
同时查看metadata plugin - 它从DOM元素中提取元数据并将其作为对象返回(在评论here中讨论)。
答案 3 :(得分:-4)
它被本地浏览器放入缓存,就像一个cookie
from jquery uncompressed:
if ( data !== undefined ) {
thisCache[ name ] = data;
}