我最近需要将一些数据附加到动态创建的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()
方法,就像永远一样。
答案 0 :(得分:3)
你对循环引用是正确的,这不是IE之外的问题,而在IE中它只会在JavaScript引用DOM对象时出现问题,并且JS对象是分配给DOM对象的一个属性。我相信这可以通过简单地将JS中的任何引用置为DOM对象来解决。
$().data()
方法是$.data()
过于复杂的包装器(请参阅jQuery.fn.data
:http://github.com/jquery/jquery/blob/master/src/data.js#L126,后者又调用jQuery.data
:http://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问题,这迫使我求助于使用 隐藏元素。幸运的是,我没有500多个元素,但更像是五个或六个。$.data