JQuery Datalink - связывание данных - PullRequest
2 голосов
/ 16 мая 2010

Я пробовал jQuery Предложение по связыванию данных от Microsoft и заметил что-то странное.

Мои объекты получают это дополнительное свойство, и мне было интересно, какова причина этого. Сначала я подумал, что сделал ошибку, но заметил, что их демонстрационная страница делает то же самое

Это результат json моих объектов:

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

Я имею в виду свойство "jQuery1274021322131".

Ответы [ 2 ]

4 голосов
/ 16 мая 2010

Когда вы приводите объект 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 голос
/ 28 мая 2010

jQuery использует expando, чтобы связать объект (элемент dom или другой) с его кешем данных при использовании метода data () (это НЕ вызывается простым запуском $ (), как указано в принятом ответе) , Плагин связывания данных использует data () для объекта, создавая тем самым экспансию. К сожалению, экспансия настолько «регулярна», что ее легче скрыть. Например, это должна быть инкапсулированная функция, чтобы сериализаторы JSON ее не включали. jQuery работает с обычными объектами, но есть некоторые грубые края, как этот. Надеюсь, они могут быть устранены в будущем.

...