【问题标题】:Potential performance improvement from inserting chunks of DOM elements dynamically as needed?根据需要动态插入 DOM 元素块可能会提高性能吗?
【发布时间】:2017-12-05 10:34:08
【问题描述】:

我正在寻找提高单页网络应用性能的方法,该应用需要在包括低端手机在内的各种设备上运行。

我有 8 个模式(Twitter Bootstrap,但这个问题适用于任何框架),它们在我的页面 DOM 元素总数 (783) 中添加了 200 多个元素。是否值得将这些作为 Javascript 中的字符串而不是 HTML 中的代码,并在需要时在显示之前立即将它们注入 DOM,然后再将它们删除?将实时 DOM 大小减少四分之一,从而使例如JQuery 元素搜索更快、更轻量级的页面等。

我想以 JQuery 的 $.detach() 和 $.append() 为例

【问题讨论】:

    标签: javascript jquery html dom


    【解决方案1】:

    每当您修改 DOM 时,都会对性能造成影响,因为浏览器将不得不“重排”和“重绘”用户界面。因此,将这些修改保持在最低限度会有所帮助,但是批量修改会吸收一些性能损失(即单独更改 3 个 DOM 元素比同时更改所有 3 个元素更昂贵)。因此,请尽可能将您的 DOM 更改组合在一起。

    您用来注入新内容的实际机制可能是:

    1. 将 HTML 字符串传递给 HTML 解析器并要求它解析 按需串。这与流程基本相同 当从服务器解析页面时会发生这种情况。使用 标准的 .innerHTML 或 JQuery .html() 可以实现这一点。

    2. 您也可以先在内存中构建 DOM 元素,然后 在正确的时间将该节点注入 DOM(即document.createElementdocument.createDocumentFragment)。我一般赞成 这种方法更加程序化,大大减少了 字符串连接和引用错误的可能性,并且是 阅读更干净。从性能的角度来看,这为您提供了 在 DOM 注入之前完成一些工作的好处 时间。这相当于 DOM .appendChild() 或 JQuery .append() 方法。

    最后,今天的现代用户代理处理 DOM 更改的能力比过去要好得多,而且任何一种方法都是可行的。你想要远离的真正糟糕的技术(比如在循环中修改 DOM)最终会有所作为。

    【讨论】:

    • 很棒的信息,谢谢。它值得做吗,而不是将所有模式留在 HTML 代码中(即在实时 DOM 中),我猜我的任何 JQuery 选择器都必须解析才能获得其他东西?或者也许值得将模式放在我的 HTML 代码的末尾?谢谢
    • @AlexKerr 如果迟早需要模态框,最好从一开始就将它们放入 HTML 中,因为将它们包含在 DOM 的初始构建中不会增加太多开销.
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2011-03-26
    • 1970-01-01
    • 2013-04-12
    • 2019-12-07
    • 2016-02-22
    相关资源
    最近更新 更多