0

我们使用 asp.net mvc、javascript 和 jQuery(托管在本地机器上)创建了一个应用程序。基本设计是,当用户从一个页面导航到其他页面时,通过隐藏和显示 HTML 页面,我们将所有 HMTL 元素保留在 DOM 对象(浏览器)中而不是销毁。

我们的应用程序每天都在增长。早些时候,我在我的项目中没有看到任何性能问题。但是现在,如果我将一个页面导航到另一个页面需要很长时间。今天我检查了我页面中的 DOM 元素,它超过了 20,000 个。

问题:


隐藏/显示 HTML 页面是比破坏和重新创建更好的设计吗?

使用 20,000 个 DOM 对象从 javascript 进行 DOM 操作,在回流和重印方面对性能有什么影响?

4

1 回答 1

2

仅供参考,在撰写本文时,单页 HTML5 规范本身有 109k DOM 元素(甚至更多 DOM 节点)。

隐藏/显示 HTML 页面是好的设计,而不是破坏和重新创建?

这在很大程度上取决于是否有必要(例如,因为重新创建已删除的部分会很慢)和/或可能(用户交互经常导致隐藏的部分再次显示)。

有几件事会减慢你的速度

a) 垃圾收集。更多节点 = 垃圾收集器要遍历的模式对象。原则上,现代垃圾收集器应该能够处理许多长期存在的对象,方法是将它们填充到旧区域中,然后不再被触及,但并非所有浏览器都有最先进的 GC。

b) 回流事件/dom 查询/遍历操作等。

c) javascript 代码随文档大小严重缩放。一些 O(n²) 算法可能会渗透到复杂的应用程序中。回调触发进一步的回调等。

如果您不想减少 DOM 树,那么您对 ​​a) 无能为力。但是 b) 和 c) 可以通过多种方式进行优化:

  • 从文档中分离子树并将它们保存在 javascript/文档片段中,这样任何遍历文档树的东西都不必处理它们
  • 不要交错操作
    1. 读取布局状态(例如获取计算的 CSS 属性、边界矩形、偏移量等)
    2. 以任何方式写入 DOM 或触发事件

      单独执行读取和写入,批量执行以最小化回流次数
  • 优化 javascript 中的热点

但这些只是一般指导方针。您应该分析您的应用程序以找出占用 CPU 时间的原因,无论您是被 GC、javascript 执行还是绘制事件控制。

于 2015-01-27T17:55:57.207 回答