当我使用IE开发人员工具时,一些DOM元素添加了jQueryXXXXXXXXX ="YY"形式的属性,其中XXXXX是一个相当长的数字字符串,YY通常是一个小整数值.
我没有在Safari上使用DOM检查器看到这些.
这些为什么以及何时添加?这些数据对我有用吗?
这是jQuery expando属性,它是用于查找其条目的对象的关键字$.cache
. $.cache
用于.data()
,事件处理程序或任何你想要留在那里的东西,它是一个集中存储事件的地方(使得全局事件更容易/更高效)和一个清理的地方.通过仅携带元素上的属性,没有必要在每个元素上都有一个数据存储,它可能无法正确克隆 - 跨浏览器,而只是维护这个键,并且可以$.cache
在任何时候在对象中查找它的条目.
我们来举个例子:
domElement[$.expando] //only works in 1.4+, expando was private previously
Run Code Online (Sandbox Code Playgroud)
这将给出"ID"或各种键,该键对应于$.cache
存储该元素的数据/事件的对象上的属性(如果它具有任何数据/事件处理程序).例如,如果密钥为"4",则它将在内部用于访问$.cache[4]
.
$.cache
包含jQuery分配的所有元素的所有数据,事件处理程序等.它是通过递增来分配的$.uuid
(一个内部的攀爬ID jquery分配并在新对象添加到任何时候递增$.cache
).
一些额外的位:
名字的随机性是不是所有的随机的,jQueryXXXXXXXXXXXXXXXXX
是刚刚jQuery
+时间戳然后jQuery的加载,给该属性的唯一希望不冲突的名称.
你为什么不看到它.html()
?,因为jQuery隐藏了它,它做了一个正则表达式去除它.
注意: $.expando
1.3中没有暴露,只有1.4+.
用法:
它有用吗?好吧,例如,如果您$.cache
在控制台中进行分析,并且您发现内存泄漏(.empty()
在许多.load()
调用之前没有,例如留下事件处理程序).你打开你的控制台,然后$.cache
你看到那里有500个条目,假设你想知道哪个对象有312个,那么你可以选择它,如下所示:
$("[" + $.expando + "=312]")[0] //DOM element for this entry
Run Code Online (Sandbox Code Playgroud)
另一个例子,这个:
$("#myElem").data('events') //get events object, equivalent to:
$.cache[$("#myElem")[0][$.expando]].events
Run Code Online (Sandbox Code Playgroud)
这是一个方便的例子,通常是普通的jQuery用户不需要深入$.cache
了解它是如何工作的,但它是存在的,以备你永远不需要去寻找.只需$.cache
在您的控制台中运行,您可能会获得有关您不知道的所有处理程序的大量信息:)
归档时间: |
|
查看次数: |
1033 次 |
最近记录: |