2

我正在尝试Microsoft 的 jQuery Data 链接提案,并注意到一些奇怪的东西。

我的对象获得了这个额外的属性,我想知道这是什么原因。我首先认为这是我犯的一个错误,但我注意到他们的演示页面做了同样的事情

这是我的对象的 json 结果:

[{
        "propertyName":"ProductNamese",
        "controlType":"Text",
        "jQuery1274021322131":6
    },
    {
        "propertyName":"Price",
        "controlType":"Number",
        "jQuery1274021322131":9
    },
    {
        "propertyName":"Description",
        "controlType":"TextArea",
        "jQuery1274021322131":12
    }
]

我正在谈论的属性是“jQuery1274021322131”。

4

2 回答 2

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
于 2010-05-16T15:10:31.117 回答
1

当使用 data() 方法时,jQuery 使用 expando 将对象(dom 元素或其他元素)与其数据缓存相关联(它不是由简单地在其上运行 $() 引起的,正如接受的答案所指定的那样)。数据链接插件在对象上使用 data(),从而创建了 expando。不幸的是,expando 是如此“常规”——它应该更容易隐藏。例如,它应该被封装一个函数,以便 JSON 序列化器不包含它。jQuery 适用于常规对象,但也有一些像这样的粗糙边缘。希望它们在未来能够得到解决。

于 2010-05-28T04:10:34.450 回答