2010-05-16 56 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 2010-05-16 15:08:27

回答

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()方法時(它不是由簡單地運行$()引起的,因爲接受的答案是指定的)。數據鏈接插件使用對象上的data(),從而創建expando。不幸的是,expando非常「常規」 - 它應該更容易隱藏。例如,它應該封裝一個函數,以便JSON序列化程序不包含它。 jQuery與常規對象一起工作,但有一些像這樣的粗糙邊緣。希望他們未來能夠被淘汰出局。

+0

它是一個純字符串的原因是爲了避免將函數附加到DOM元素。使用純字符串作爲$ .data緩存中的關鍵字意味着您不會在IE中獲取內存泄漏。 – 2011-05-04 15:52:28

+0

將函數附加到DOM元素本身不是泄漏,如果該函數引用元素(直接或通過閉包引用),那麼它只是一個泄漏,因爲這會導致DOM和JS對象之間必須被打破以避免泄漏的循環引用。你想要避免直接將數據放在元素上,因爲誰知道數據包含什麼,它可能會導致循環引用。我提出的是一個包含expando('string')的空函數,或者甚至將expando作爲字段(在函數上)。它是安全的。只是一個把它從JSON序列化器中隱藏起來的技巧。 – InfinitiesLoop 2011-05-04 23:21:46