jQuery Datalink - 数据链接

时间:2010-05-16 14:58:24

标签: javascript jquery data-linking

我正在尝试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”。

2 个答案:

答案 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适用于常规对象,但是有一些像这样的粗糙边缘。希望将来可以解决这些问题。