当我使用IE开发人员工具时,一些DOM元素添加了jQueryXXXXXXXXX=" YY“形式的属性,其中XXXXX是一个相当长的数字字符串,而YY通常是一个很小的整数值。
我在Safari上的DOM检查器中没有看到这些。
为什么以及何时添加这些?这些数据对我有什么用吗?
发布于 2010-07-27 00:16:36
这是jQuery expando attribute,它是对象上的一个键,用于在$.cache
中查找它的条目。$.cache
用于.data()
、事件处理程序或任何你想放在其中的东西,它是一个集中存储事件的地方(使触发全局事件变得更容易/更有效),也是一个清理的地方。通过只在元素上携带属性,没有必要在每个可能无法跨浏览器正确克隆的元素上有一个数据存储,而是它只维护这个键,并且可以随时在$.cache
对象中查找它的条目。
让我们举个例子:
domElement[$.expando] //only works in 1.4+, expando was private previously
这将给出一个"ID“或某种键,该键对应于存储此元素的数据/事件的$.cache
对象上的属性(如果它有任何数据/事件处理程序)。例如,如果密钥是"4",它将在内部用于访问$.cache[4]
。
$.cache
包含由jQuery分配的所有元素的所有数据、事件处理程序等。它的赋值方式是递增$.uuid
(一个内部不断攀升的ID会在任何时候向$.cache
中添加新对象时赋值和递增)。
几个额外的比特:
名称的随机性并不都是随机的,jQueryXXXXXXXXXXXXXXXXX
是just jQuery
+ the timestamp then jquery was loaded,以便为属性提供一个唯一的、希望不冲突的名称。
你为什么不在.html()
中看到它呢?因为jQuery hides it,它做了regex to strip it out。
注意:在1.3中没有公开$.expando
,只有1.4+公开了。
用法:
它有用吗?例如,如果您在控制台中分析$.cache
,您会发现存在内存泄漏(在多次.load()
调用之前没有.empty()
,例如留下事件处理程序)。你打开你的控制台,执行$.cache
,你会看到500个条目,假设你想知道哪个对象符合312,然后你可以选择它,就像这样:
$("[" + $.expando + "=312]")[0] //DOM element for this entry
再举一个例子,这是:
$("#myElem").data('events') //get events object, equivalent to:
$.cache[$("#myElem")[0][$.expando]].events
这是一个很方便的示例,一般jQuery用户不需要深入了解$.cache
或它是如何工作的,但它就在那里,如果您永远不需要查看它,它就可以使用。只需在控制台中运行$.cache
,可能会有大量关于您的所有处理程序的信息,而您并不知道这些信息是可用的:)
https://stackoverflow.com/questions/3336672
复制相似问题