2010-05-16 51 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