我在我的页面中使用jQuery,当我使用Chrome开发工具时,我在Console中找到了jQuery18007779947370290756和jQuery对象.jQuery18007779947370290756只包含几个方法.jQuery包含更多方法.那么什么是jQuery18007779947370290756?我没有页面的网址,因为它是内部页面.我包含的lib只是jquery-1.8.0.min.js和jquery-ui-1.8.23而没有JSONP调用.
看起来我是否'beforeunload'向窗口对象添加了一个全局事件.它存储在窗口[expando]中.但是,如果我将一些事件添加到其他DOM对象中button,并且它们存储在jQuery.cache中.这里是屏幕截图jQuery.cache和窗口[jQuery1800xxxxxxxxxxxxxxxx]我不知道为什么这两个点击事件的guid都是8.这两个点击事件绑定到2个按钮.和click事件处理程序是相同的功能.

看着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, "" ),
Run Code Online (Sandbox Code Playgroud)
也许这是以导致对象出现的方式使用的.
在调查之后,我更加确信这就是答案.
此外,对于不同版本的jQuery,它看起来有点不同:
jQuery16406568800362638323 v1.6.4
jQuery18007779947370290756 v1.8.0
jQuery1820604904827339435 v1.8.2
Run Code Online (Sandbox Code Playgroud)
你可以看到版本在数字的第一部分.
我还发现有些地方elem[ expando ]被创造出来.如果elem是window,那么这是它.
例如,它在jquery-latest.js的第4770行
if ( (cache = elem[ expando ]) === cachedkey ) {
Run Code Online (Sandbox Code Playgroud)
当您在其上存储数据时,jQuery将此属性添加到元素.由于此属性位于window元素上,因此代码中的某个位置会执行以下操作:
$(window).data('something', 1);
Run Code Online (Sandbox Code Playgroud)
请注意,jQuery事件也在data幕后使用模块,因此这也可能是因为您要向window对象添加事件.
对于普通节点(即具有nodeType属性的元素),此值设置为GUID(data.js#61),并且要存储在该对象上的数据存储在全局jQuery缓存中.
但是window元素没有nodeType属性,所以它沿着我是一个普通的JS对象的路线; 这导致数据直接存储在对象本身(在这种情况下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,
Run Code Online (Sandbox Code Playgroud)
在普通DOM元素的情况下,在data.js#61中为值分配GUID :
elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
Run Code Online (Sandbox Code Playgroud)
但是对于普通的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;
}?
Run Code Online (Sandbox Code Playgroud)
奇怪的值是jQuery.expando在data.js#14中定义的,并初始化为:
"jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" )
Run Code Online (Sandbox Code Playgroud)
(基本上,"jQuery",然后是删除了"."的jQuery版本(在你的情况下为1800),然后是随机数).
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |