在浏览源代码时,我注意到'toggle'应该使用jQuery._data
来存储元素的状态。我检查了chrome中的jQuery.cache
对象,发现元素的数据对象下面还有另一个对象,它由jQuery一词前面加上一个我猜是唯一标识它的数字。但是,我没有看到关于元素状态的数据。只需{olddisplay: 'block'}
。关于jQuery._data的目的以及它本身如何工作的任何线索?
我一整天都在盯着源头......请不要告诉我查看来源。我的眼睛和大脑会感谢你。
答案 0 :(得分:47)
jQuery使用_data为它存储在对象上的数据设置'pvt'标志。使用pvt
,以便在从对象请求公共数据时,不会返回pvt数据。这是为了让jQuery内部使用.data()
机制(如切换所做的那样)来影响公共使用.data()
。
您可以在jQuery源代码中看到此声明:
// For internal use only.
_data: function( elem, name, data ) {
return jQuery.data( elem, name, data, true );
},
只调用jQuery.data
并强制第四个参数(即隐私)为真。检索数据时,如果设置了pvt
标志,则会以稍微不同的方式检索它。 .data()
的公共接口不公开pvt
标志。
您可以在pvt
的这一部分中看到jQuery.data()
处理的示例:
// An object can be passed to jQuery.data instead of a key/value pair; this gets
// shallow copied over onto the existing cache
if ( typeof name === "object" || typeof name === "function" ) {
if ( pvt ) {
cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
} else {
cache[ id ] = jQuery.extend(cache[ id ], name);
}
}
然后在同一个函数中,这个评论非常具有描述性:
// Internal jQuery data is stored in a separate object inside the object's data
// cache in order to avoid key collisions between internal data and user-defined
// data
if ( pvt ) {
if ( !thisCache[ internalKey ] ) {
thisCache[ internalKey ] = {};
}
thisCache = thisCache[ internalKey ];
}