当我使用IE开发人员工具时,一些DOM元素添加了属于该形式的属性
jQueryXXXXXXXXX = “YY”
其中XXXXX是一个相当长的数字字符串,YY通常是一个小整数值.
jQueryXXXXXXXXX = “YY”
其中XXXXX是一个相当长的数字字符串,YY通常是一个小整数值.
我没有在Safari上使用DOM检查器看到这些.
这些为什么以及何时添加?这些数据对我有用吗?
解决方法
这是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 jquery分配并在每个新对象添加到$.cache中时递增)来分配的.
一些额外的位:
该名称的随机性并非完全随机,jQueryXXXXXXXXXXXXXXXXX为just jQuery
+ the timestamp then jquery was loaded,为该属性提供一个独特的希望非碰撞名称.
你为什么不用.html()?看到它,因为jQuery hides it,它确实是regex to strip it out.
注意:$.expando不会在1.3中公开,只有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,就可能有大量关于您不知道的所有处理程序的信息:)