2010-05-16 1 views
2

Я пробовал jQuery Data linking proposal from Microsoft и заметил что-то странное.jQuery Datalink - Связывание данных

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

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

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

Свойство Я говорю о «jQuery1274021322131».

+0

Как создается этот JSON-результат? Тогда нам было бы легче проверить исходный код этого плагина jQuery. – Harmen

ответ

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

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

+0

Причина, по которой это простая строка, заключается в том, чтобы избежать присоединения функций к элементам DOM. Использование простой строки в качестве ключа в кеше $ .data означает, что вы не получаете утечек памяти в IE. –

+0

Прикрепление функции к элементу DOM само по себе не является утечкой, это только утечка, если эта функция ссылается на элемент (напрямую или через ссылку на замыкание), поскольку это вызывает круговую ссылку между объектами DOM и JS, которые необходимо сломать, чтобы избежать утечки. Вы хотите также не помещать данные непосредственно в элемент, так как кто знает, что содержат данные, он может также вызвать круговую ссылку. Я предложил пустую функцию, содержащую expando («строка») или даже имеет расширение в качестве поля (для функции). Это безопасно. Просто трюк, чтобы скрыть его от сериализаторов JSON. – InfinitiesLoop

 Смежные вопросы

  • Нет связанных вопросов^_^