2010-05-03 36 views

回答

14

The jQuery source很容易阅读,你可以看看data函数在做什么。

总结:

  • jQuery有一个名为 '的expando',这是'jQuery'+(+new Date)
  • jQuery的变量有一个称为uuid另一个变量,其与启动 “1”
  • jQuery.cache是一个空对象
  • 设置/获取HTML元素/对象上的任何“数据”将使用对象上的expando属性将参考存储到jQuery.cache - 排序像这样:

     
    // get the elements cache id, or create a new cache id: 
    var id = elem[expando] || (elem[expando] = uuid++); 
    // get the cache for the element, or create it: 
    var data = jQuery.cache[id] || (jQuery.cache[id] = {}); 
    

  • 事件处理程序被存储在该内部data对象的eventshandle性质。

所以,这是使用.data()使用的HTML这个“EXPANDO”指定属性,在内部的所有属性来存储一键进入jQuery的内部数据缓存。 jQuery事件处理程序也存储在同一个缓存中。分配给expando的数字值是一个递增计数器,它引用其在jQuery缓存对象中的位置。

+0

很好的答案,谢谢! – macca1 2010-05-06 15:04:39

0

我怀疑它隐藏在萤火虫中,因为我也看到了jquery数据对象。

我相信你使用的jQuery或任何插件只是增加了IE浏览器作为修复/解决各种浏览器特定错误/缺点的解决方法。

+0

这不是一个IE修复/解决方法 - 这是jQuery用来附加事件处理程序和其他各种数据。 – gnarf 2010-05-03 20:36:15

4

jQuery使用此“expando”将数据和事件绑定到对象。它看起来像它与数据和事件缓存一起工作。不过,我很乐意听到更深入的解释。

+0

@大卫默多克 - 我试图更深入的解释 – gnarf 2010-05-03 20:42:01

0

如果您使用jQuery的.html()方法来查找HTML字符串,请注意,如果该HTML包含任何已注册事件的元素,您可能会获得比您讨价还价更多的元素。

不要依赖.html()来创建格式良好的XML片段。

我的快速解决方案是改变业务秩序。数据发送后,我只是做了我的jQuery事件绑定。然后,鉴于我花费的时间花费了很多时间,但是仍然是一个重要的教训,这是一个艰难的教训。

我猜你正在使用1.3.1,该问题已在更高版本中修复。所以只是更新和概率,你会没事的。