jQuery $ .data()与DOM对象属性

时间:2010-08-04 16:28:39

标签: javascript jquery html dom

我最近需要将一些数据附加到动态创建的LI elements。在我的第一个例子中,我以类似

的方式使用了.data()
var _newli = $('<li>foobar</li>');
_newli.data('base', 'ball');
// append _newli to an `ul`

那个......非常强烈慢。这个逻辑发生在一个循环中,很容易长到500多个项目,花了很长时间!有时它甚至打破了javascript执行时间框架。

所以我改为$.data()。不知何故,将数据附加到具有 8x 的对象比通过.data()方法调用执行此操作更快。所以现在看起来像

var _newli = $('<li>foobar</li>');
$.data(_newli[0], 'base', 'ball');
// append _newli to an `ul`

那确实更快,但是仍需要3-4秒(!)来构建我的所有元素(在我的实际代码中,每个元素有6个调用$ .data)。

所以我真的很困惑,我问自己为什么要使用.data()$.data()呢?我可以将我的数据附加到DOM object。所以我做了

var _newli = $('<li>foobar</li>');
_newli[0].base = 'ball';
// append _newli to an `ul`

Voila,令我震惊,那非常快!我无法相信这种情况如此好,没有任何不利之处。所以这实际上是我的问题。到目前为止,我在网上找不到这种技术的任何缺点。您可以使用这种方式创建有关循环引用的内容,但只有当您引用objects时才会在IE上创建“AFAIK”。

任何想法专家?

更新

感谢您的好评和帖子。简短更新@patrick dw:

你是对的,我在使用DOM element时正在通过底层$.data()。它甚至不能与jQuery对象一起使用,至少不如预期的那样。 关于使用一个对象并通过$.date()传递它的想法我自己,但是我再次对性能差异感到震惊,我决定只是忽略.data()方法,就像永远一样。

3 个答案:

答案 0 :(得分:3)

你对循环引用是正确的,这不是IE之外的问题,而在IE中它只会在JavaScript引用DOM对象时出现问题,并且JS对象是分配给DOM对象的一个​​属性。我相信这可以通过简单地将JS中的任何引用置为DO​​M对象来解决。

$().data()方法是$.data()过于复杂的包装器(请参阅jQuery.fn.datahttp://github.com/jquery/jquery/blob/master/src/data.js#L126,后者又调用jQuery.datahttp://github.com/jquery/jquery/blob/master/src/data.js#L20因此,削减那个中间人将节省非常多的时间,特别是如果它要完成500次。

在这种情况下,$().data('foo', 'bar')方法的作用不会超过el.foo = 'bar'。做得最快。

答案 1 :(得分:2)

尝试向NodeList对象添加自定义属性时,浏览器(IE)可能会禁止它。请参阅:http://lists.w3.org/Archives/Public/public-webapps/2010JanMar/0864.html

答案 2 :(得分:0)

这些可能会有所帮助:

使用自定义DTD阅读以下内容:

简而言之,在大多数情况下,我认为您不会遇到使用自定义属性的任何问题。大多数明智/当前的浏览器都可以使用它。我会说,我确实遇到了我为MobileSafari开发的webapp问题,这迫使我求助于使用 $.data 隐藏元素。幸运的是,我没有500多个元素,但更像是五个或六个。