javascript - 多个小型 DOM 操作与一个大型 DOM 操作

标签 javascript html dom web

这更多是关于最佳实践的问题。当尝试在 Web 应用程序中应用类似 MVC 的设计模式时,我经常发现自己不知道应该如何更新 View 。

例如,如果我要更新具有 X 个元素的 View_1。是否更好:

A:遍历每个 X 元素,确定哪些元素需要更新并以非常精细的粒度应用 DOM 更改。

B:使用模型或其他数据结构提供的数据为整个 View 及其所有封闭元素重新生成标记,并在一次 DOM 操作中替换 View_1 的根元素?

如果我错了,请纠正我。我听说渲染引擎在一次性替换大块 DOM 时通常比多个较小的 DOM 操作更有效。如果是这种情况,则方法 B 更胜一筹。然而,即使使用模板引擎,有时我仍然发现很难避免为未更改的部分 View 重写标记。

在重命名之前,我查看了 Bespin 项目的源代码。我清楚地记得他们实现了某种渲染循环机制,其中 DOM 操作在固定的时间间隔内排队和应用,就像游戏管理帧的方式一样。这类似于方法 A。我也可以看出这种方法背后的基本原理。以这种方式应用的小型 DOM 操作可保持 UI 响应(对于 Web 文本编辑器尤其重要)。同样,通过这种方式,可以通过仅更新需要更改的元素来提高应用程序的效率。静态文本和美学元素可以保持不变。

这些是我对双方的论点。你们有什么感想?我们是在某个地方寻找一种快乐的媒介,还是总的来说一种方法更优越?

此外,是否有任何关于这个特定主题的好书/论文/网站?

(让我们假设有问题的网络应用程序是大量动态更新的交互)

最佳答案

的确,渲染引擎通常处理大块变化比处理多个小变化更快。

tl;dr:bespin 方法是理想的,如果可以的话,在 worker 中进行。

根据更改量的大小,您可能想尝试启动一个工作程序并计算工作程序内部的更改,因为长时间运行的 JS 会锁定 UI。您可以考虑使用以下流程:

  1. 使用部分 dom 树和父 id 创建一个对象。
  2. 将对象字符串化为JSON
  3. 开始一个 worker
  4. 将字符串化对象传入worker
  5. 接收并解析字符串。
  6. 努力更改您传入的 dom 树的所有必要部分。
  7. 再次将对象字符串化。
  8. 将对象传回主线程。
  9. 解析并提取新的 dom 树。
  10. 再次插入dom。

如果有很多变化和一棵小树,这会更快。如果它是一棵大树并且几乎没有变化,那么只在真实 DOM 树的副本中进行本地更改会更快,然后一次性更新 DOM。

另请阅读有关页面速度的谷歌网站:

https://code.google.com/speed/articles/

尤其是这篇文章:

https://code.google.com/speed/articles/javascript-dom.html

关于javascript - 多个小型 DOM 操作与一个大型 DOM 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750101/

相关文章:

javascript - 移动浏览器(Android、iPhone 和 BlackBerry)的模态弹出表单

javascript - json 中的字符串被写入文本而不是 dom 元素

Javascript - 如何从特定 div 类中的标签获取属性值?

html - 在网格 960 中定位一个 div 会添加神秘的填充/边距

javascript - 等待 iframe 在 JavaScript 中加载

javascript 在循环中添加分钟

javascript - 在运行函数之前确保我的循环完全完成?

javascript - HTML5 Canvas : Same code outputs different results in different browsers

javascript - 单击下一个下拉菜单打开器按钮时关闭上一个下拉菜单并保持该菜单打开

html - 让 Bootstrap 4 导航栏侧边栏扩展到页面的全高