我正在尝试jQuery Data linking proposal from Microsoft 并注意到一些奇怪的事情。
我的对象得到了这个额外的属性,我想知道是什么原因。我首先想到这是我犯的错误,但我注意到他们的演示页面做了同样的事情
这是我的对象的json结果:
[{
"propertyName":"ProductNamese",
"controlType":"Text",
"jQuery1274021322131":6
},
{
"propertyName":"Price",
"controlType":"Number",
"jQuery1274021322131":9
},
{
"propertyName":"Description",
"controlType":"TextArea",
"jQuery1274021322131":12
}
]
我所说的属性是“jQuery1274021322131”。
答案 0 :(得分:4)
当您将DOM对象转换为jQuery对象(即$("#SomeElementID")
)时,jQuery会向对象附加一个特殊的“expando”属性。我相信库中内部使用此属性来帮助缓存其内部数组中的元素,以便更快地访问。
挖掘库,这是创建该值以及如何在内部使用它的代码:
var expando = "jQuery" + now(), uuid = 0, windowData = {};
jQuery.extend({
cache: {},
data: function( elem, name, data ) {
elem = elem == window ?
windowData :
elem;
var id = elem[ expando ];
// Compute a unique ID for the element
if ( !id )
id = elem[ expando ] = ++uuid;
// Only generate the data cache if we're
// trying to access or manipulate it
if ( name && !jQuery.cache[ id ] )
jQuery.cache[ id ] = {};
// Prevent overriding the named cache with undefined values
if ( data !== undefined )
jQuery.cache[ id ][ name ] = data;
// Return the named cache data, or the ID for the element
return name ?
jQuery.cache[ id ][ name ] :
id;
},
// snipped
答案 1 :(得分:1)
当使用data()方法时,jQuery使用expando将一个对象(dom元素或其他)与它的数据缓存相关联(它不是由简单地运行$()引起的,因为接受的答案指定了) 。数据链接插件使用对象上的data(),从而创建expando。令人遗憾的是,expando非常“常规” - 它应该更容易被隐藏起来。例如,它应该被封装一个函数,以便JSON序列化程序不包含它。 jQuery适用于常规对象,但是有一些像这样的粗糙边缘。希望将来可以解决这些问题。