jQuery如何使用.data()存储数据?

我有点困惑jQuery如何使用.data()函数存储数据。

这是什么名为expando ? 或者这是否使用HTML5 Web Storage虽然我认为这不太可能?

文件说:

.data()方法允许我们以一种不受循环引用安全的方式将任何类型的数据附加到DOM元素,从而避免内存泄漏。

当我读到有关expando的消息时,它似乎存在内存泄漏的风险。 不幸的是,我的技能不足以阅读和理解jQuery代码本身,但我想知道jQuery如何使用data()存储这些数据。

  • http://api.jquery.com/data/

基本上,jQuery使用data(name, value)/data(name)保存您存储/检索的信息data(name, value)/data(name)并使用名为cache的内部javascript对象中的removeData(name)进行删除。 其余的只是一些javascript魔术使其工作并保持所有关联正确。

哦,回答你问题的第一部分。 它既不是expando也不是HTML5 WebStorage。

为了纠正自己,我认为jQuery确实在一次使用expando。 它为您使用data() on的元素设置了一个属性,以便将信息存储到它们。 属性名称如下所示

 "jQuery" + now() //eg jQuery1268647073375 

顺便说一句。 now()是一个返回(new Date).getTime()的内部函数

并且值是jQuery生成的UUID

这样jQuery以后就可以从它的内部缓存中检索正确的关联数据。

因此,如果你担心IE中的expando,我记得你无法删除它们,那么泄漏应该是最小的,因为jQuery每个元素只使用1个expando存储数据。 除非你在几千个元素上调用data() ,否则我看不到内存问题

jQuery.fn.extend函数data使用此语句来保存提供的变量:

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

jQuery.cache只是一个标准对象cache: {},在jQuery名称空间内定义为cache: {},

所以回答你的问题 – 我相信jQuery将数据存储在称为cache标准内部JavaScript对象中。

哦,关于你的内存泄漏问题 – 我真的不知道。 如果JavaScript在标准JS对象中存储对DOM元素的引用有一些麻烦,这可能是一个问题。

还要检查元数据插件 – 它从DOM元素中提取元数据并将其作为对象返回(在此处的注释中讨论)。

它本地浏览器将其放入缓存中,就像cookie一样

  from jquery uncompressed: if ( data !== undefined ) { thisCache[ name ] = data; }