代码之家  ›  专栏  ›  技术社区  ›  jAndy

jquerys$.data()与dom对象属性

  •  9
  • jAndy  · 技术社区  · 15 年前

    我最近需要将一些数据附加到动态创建的 LI elements . 在我的第一个例子中,我使用 .data() 以某种方式

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

    那…是 可怕地 慢。这个逻辑发生在一个循环中,这个循环很容易增长到500多个项目,需要花费很多时间!有时甚至打破了JavaScript的执行时间框架。

    所以我改为 $.data() . 以某种方式,将数据附加到对象上 8X 比过去快 数据() 方法调用。所以现在看起来

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

    这确实更快,但还是花了3-4秒。构建所有元素(在我的实际代码中,每个元素有6个对$.data的调用)。

    所以我真的坚持了下来,我问自己为什么要用这个 数据() $DATA() 反正?我可以将我的数据附加到 DOM object . 所以我做到了

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

    沃伊拉 真的 令我震惊的是,速度太快了!我真不敢相信这一切顺利而没有任何不利条件。这就是我的问题所在。到目前为止,我在网上没有发现这种技术的任何缺点。有关于 循环引用 您可以使用这种方式创建,但只有在IE上“仅”使用afaik,并且仅当您引用 objects .

    有什么想法专家吗?

    更新

    感谢各位的好评和发帖。patrick dw的简短更新:

    你说得对,我刚穿过内裤 DOM element 使用时 $DATA() . 它甚至不能与jquery对象一起工作,至少不像预期的那样。 使用一个对象并传递它的想法 $.date() 我有过自己,但我再次对性能差异感到震惊,我决定忽略 数据() 方法就像永远。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Ryan Tenney    15 年前

    你说得对 循环引用 ,这不是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' . 做最快的事。

        2
  •  2
  •   Tim    15 年前

    当试图向nodelist对象添加自定义属性时,浏览器(ie)可能不允许这样做。见: http://lists.w3.org/Archives/Public/public-webapps/2010JanMar/0864.html

        3
  •  0
  •   Community Mohan Dere    9 年前

    这些可能有助于:

    并阅读以下关于使用自定义DTD的内容:

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