我看到jQueryXXX ="YY"属性添加到我的一些DOM元素中

Zha*_*ami 8 jquery

当我使用IE开发人员工具时,一些DOM元素添加了jQueryXXXXXXXXX ="YY"形式的属性,其中XXXXX是一个相当长的数字字符串,YY通常是一个小整数值.

我没有在Safari上使用DOM检查器看到这些.

这些为什么以及何时添加?这些数据对我有用吗?

Nic*_*ver 9

这是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在您的控制台中运行,您可能会获得有关您不知道的所有处理程序的大量信息:)