【问题标题】:What are the performance implications of getElementsByTagName("*")?getElementsByTagName("*") 对性能有何影响?
【发布时间】:2017-12-12 02:01:15
【问题描述】:

首先让我说我不是 JavaScript 开发人员,所以这个问题可能相当基本。

在模拟 IE 的非标准 all 属性时,我使用的是 getElementsByTagName("*"),这两种方法之间是否存在显着的性能差异?

【问题讨论】:

    标签: javascript cross-browser


    【解决方案1】:

    如果有兴趣,您可能会发现 John Resig 的这个讲座很有趣。像您一样使用 dom 方法时,它与新用户和有经验的用户相关。

    它讨论了许多浏览器中 dom 方法的许多可爱的警告。

    其中一个,getElementsByTagName(“*”) 将在 IE5 中返回 no 元素,并在 IE7 下使用 Objects + getElementsByTagName("*") 执行 weird things,根据谈话,它是这样的:

      <a id="length"></a>
    

    表现得好像有人做过:

      var a = getElementsByTagName("a"); 
      a.length = ""; # This overrides the arrays length attribute :/ 
    

    这样你就不能迭代数组。

    我不知道哪些 javascript 库可以规避这个缺陷,但您确实应该使用一个来避免跨浏览器的麻烦。

    【讨论】:

    • 有趣的是,当您发布此内容时,我正在听这个讲座。
    【解决方案2】:

    基本上不应该有明显的性能影响,并且无论如何使用document.all 是不可接受的。

    然而,有一个问题是为什么你会对收集每个元素的集合感兴趣?我想不出一个用例不能用另一种方式更好地处理的副手。

    【讨论】:

    • 一个用例可能是您希望在符合标准的 xhtml 文档中为所有 href 设置“目标”属性的地方
    • 另一个用例可以在这里找到stackoverflow.com/questions/435429/…
    • @Nicon - 那么你仍然不需要“*”你需要“*[href]”(或者更可能只是“a”)。 @motti - 我没明白你的意思
    • 假设我有使用 MSHTML::IHTMLElement.get_all 的 C++ 代码并且我希望它在 Firefox 上工作,我可能会创建一个实现 IHTMLElement 并拥有内部 nsIDOMNSHTMLElement 的 COM 类。在那种情况下,我该如何实现 get_all ?
    • 当时不是一个真正的 JS 问题,是吗? :) 我认为熟悉您正在谈论的代码库的人必须从 C++ 的角度回答这个问题
    【解决方案3】:

    不是真正的性能影响,但值得注意:从 getElementsByTagName 返回的 nodeList 是live。如果你操作 DOM,列表也会改变以反映这一点。

    【讨论】:

      【解决方案4】:

      不同的浏览器和不同版本的浏览器有不同的性能特点。如果您正在操作大型 DOM,您应该在您关心的浏览器上进行基准测试。考虑 Javascript 库 benchmarks people post。它们展示了不同浏览器的性能有多大差异。因此,如果不知道您使用的是什么浏览器,这个问题就无法真正回答。但是,您也应该警惕过度优化的东西,这对于大多数人来说可能在大多数机器上实际上花费零时间。

      【讨论】:

        猜你喜欢
        • 2015-03-04
        • 2019-09-04
        • 2021-04-20
        • 2011-11-12
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        相关资源
        最近更新 更多