2010-03-15 43 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中讨论)。

相关问题