10

我在我的页面中使用 jQuery,当我使用 Chrome 开发工具时,我在控制台中找到了 jQuery18007779947370290756 和 jQuery 对象。jQuery18007779947370290756 只包含几个方法。jQuery 包含更多的方法。那么 jQuery18007779947370290756 是什么?我没有页面的网址,因为它是内部页面。我包含的库只是 jquery-1.8.0.min.js 和 jquery-ui-1.8.23 并且没有 JSONP 调用。

看起来如果我'beforeunload'向窗口对象添加了一个全局事件。它存储在 window[expando] 中。但是,如果我将一些事件添加到其他 DOM 对象,例如button,并且它们存储在 jQuery.cache 中。这是 jQuery.cache 和 window[jQuery1800xxxxxxxxxxxxxxxx] 的屏幕截图我不确定为什么 2 个单击事件的 guid 都是 8。这 2 个单击事件绑定到 2 个按钮。和单击事件处理程序是相同的功能。

在此处输入图像描述

4

2 回答 2

7

查看http://code.jquery.com/jquery-latest.js我发现有一个地方正在创建类似于我们所看到的东西。

第 1522 行附近:

// Unique for each copy of jQuery on the page
// Non-digits removed to match rinlinejQuery
expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),

也许这是以一种导致对象出现的方式使用的。

在研究了一些之后,我更加确信这就是答案。

看看http://jsfiddle.net/USAcv/

此外,对于不同版本的 jQuery,它看起来有点不同:

jQuery16406568800362638323  v1.6.4
jQuery18007779947370290756  v1.8.0
jQuery1820604904827339435   v1.8.2

您可以看到版本位于数字的第一部分。

我还发现有些地方elem[ expando ]是创建的。如果elemwindow那么就是这样。

例如,在 jquery-latest.js 的第 4770 行,它具有

if ( (cache = elem[ expando ]) === cachedkey ) {
于 2012-12-07T20:17:47.253 回答
7

当您在元素上存储数据时,jQuery 会将此属性添加到元素中。由于此属性位于window元素上,因此在您的代码中某处您正在执行的操作相当于:

$(window).data('something', 1);

请注意,jQuery 事件也在data幕后使用模块,因此这也可能是因为您正在向window对象添加事件。

对于普通节点(即具有nodeType属性的元素),此值设置为 GUID (data.js#61),并且您要存储在该对象上的数据存储在全局 jQuery 缓存中。

但是该window元素没有nodeType属性,所以它沿着I'm a plain JS object的路线走;这导致数据直接存储在对象本身上(在 的情况下window,这可能是 jQuery 的错误)。

缓存位置(全局或对象上)的选择在data.js 的 L39-45 中进行

// We have to handle DOM nodes and JS objects differently because IE6-7
// can't GC object references properly across the DOM-JS boundary
isNode = elem.nodeType,

// Only DOM nodes need the global jQuery cache; JS object data is
// attached directly to the object so GC can occur automatically
cache = isNode ? jQuery.cache : elem,

在普通 DOM 元素的情况下,该值在data.js#61中分配了一个 GUID :

elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;

但是对于普通的 JS 对象(window在这种情况下),该对象是在68 - 74中构建的:

cache[id] = {};

// Avoids exposing jQuery metadata on plain JS objects when the object
// is serialized using JSON.stringify
if (!isNode) {
    cache[id].toJSON = jQuery.noop;
}​

奇怪的值是jQuery.expando,它在data.js#14中定义,并初始化为:

"jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" )

(基本上是“jQuery”,然后是删除了“.”的 jQuery 版本(在您的情况下为 1800),然后是一个随机数)。

于 2012-12-07T20:21:26.417 回答