我有点困惑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