javascript - 一次执行多个 DOM 更改

标签 javascript performance dom

我的前端框架非常异步。这意味着,当用户执行某些操作时,“模型”会发生变化,之后会调用一堆修改 DOM 的回调。 “模型”和相关回调的更改是异步调用的,因为某些数据必须与服务器“协商”。它会导致丑陋的回流。

我已经试验过,如果我使用 JQuery 在一个代码块中进行多个 DOM 更改,所有操作都会一次完成,但我的框架需要它在独立调用中异步完成。

我需要的是类似于 DB 世界中的事务的东西。在我开始编写一些批处理 DOM 更新库之前,我想知道是否有更简单的方法。

在我的例子中,所有改变的元素都有一个父元素,所以我希望我可以告诉浏览器:“不要重绘该节点的子节点。对所有子节点进行不同的更改。现在重绘该节点的所有子节点”。你能帮帮我吗?

最佳答案

我相信没有 API 可以告诉浏览器暂停回流/重新样式化/渲染,这样它就不会在您将控制权返回给事件循环并等待来自服务器的额外数据后重新绘制.

很难证明某些东西不存在,但我认为 HTML 规范的 "Processing model"没有提到任何类似的东西——只有像 “用户代理可能希望花费更少的资源来呈现第三方内容,尤其是当它当前对用户不可见” 这样的启发式方法是有说服力的。

另一个想法:浏览器将如何处理 API calls that ask for layout/style information在渲染暂停的元素上?返回上次渲染对应的陈旧信息?新创建的元素呢?


我发布这个答案是因为你说这个问题的重点是关于内置浏览器支持,但我认为 charlietfl's answer考虑到浏览器的工作方式,是解决问题的正确方法。

关于javascript - 一次执行多个 DOM 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192139/

相关文章:

Javascript如何从 map 返回数组

javascript - Natviescript 中的 Angular 单元测试 : reflect-metadata shim is required when using class decorators

javascript - 协调 View /调度事件

javascript - fullpage.js 在部分之间添加 2 个自动滚动事件

javascript - 有没有办法知道浏览器UI线程是否繁忙?

javascript - 不能修改 DOM 元素的类

c# - 使用 WHERE IN 子句使用 Entity Framework 在 PostgreSQL 中删除多行

c++ - 有没有希望有效地调用 std::variant 上的公共(public)基类方法?

javascript - 如何使用 vanilla js 在自包含的自定义元素中剔除模板?

javascript - 如何使用 Javascript 获取 DIV 元素的顶部(如在语言环境中)属性?