2

MicrosoftからのjQueryデータリンクの提案を試していたところ、何か奇妙なことに気づきました。

私のオブジェクトはこの追加のプロパティを取得し、その理由は何であるか疑問に思いました。私は最初にそれが私が犯した間違いだと思いましたが、彼らのデモページが同じことをしていることに気づきました

これは私のオブジェクトの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

jQuery は、data() メソッドを使用するときに、expando を使用してオブジェクト (dom 要素など) をデータのキャッシュに関連付けます (受け入れられた回答で指定されているように、単に $() を実行しただけでは発生しません)。データ リンク プラグインはオブジェクトで data() を使用するため、expando が作成されます。expando が非常に「普通」であることは残念です。もっと簡単に隠す必要があります。たとえば、JSON シリアライザーに含まれないように、関数としてカプセル化する必要があります。jQuery は通常のオブジェクトで動作しますが、このような大まかなエッジがいくつかあります。うまくいけば、それらは将来的に解決される可能性があります。

于 2010-05-28T04:10:34.450 に答える