Javascript - DOM 重绘方法是否同步?

IT技术 javascript dom
2021-01-13 16:27:49

在我的问题中,DOM 重绘方法是那些修改 DOM 并导致浏览器重绘页面的方法。例如:

const newChildNode = /*...*/;

document.body.appendChild(newChildNode);

const newHeight = document.body.scrollHeight;

这段代码在正常情况下工作正常,但我不太确定它在高压条件下的表现如何,比如有很多重绘页面的请求。我可以假设 whendocument.body.scrollHeight被执行,newChildNode已经在屏幕上可见吗?

1个回答

我们可以把这个“重绘” 3个部分,处理DOM更新回流焊重绘

所有这些操作都不遵循相同的规则:

DOM 更新:始终同步。DOM 只是另一个 js 对象,它的操作方法都是同步的。

回流:这就是你偶然发现的奇怪的野兽。这是对页面上元素的所有框位置的重新计算。
通常,浏览器会等到您完成所有 DOM 修改,即 js 流结束,然后再触发它。
但是一些 DOM 方法会同步强制执行此操作。例如,所有的HTMLElement.offsetXXX和类似的属性,或Element.getBoundingClientRect,或访问文档内的Node.innerText或访问getComputedStyle返回对象(可能还有其他)的某些属性将触发同步回流,以便获得更新的值。所以当你使用这些方法/属性时要小心。

重绘:当事物实际传递给渲染引擎时。规范中没有说明何时应该发生这种情况。大多数浏览器会等待下一次屏幕刷新,但并不是说它会一直这样。例如,当您使用 阻止脚本执行时alert()Chrome 不会触发它,而 Firefox 会。

“Chrome 以不触发它而闻名..Fireox”人们到底是怎么找到这些东西的?谁知道这些东西,或者人们是如何获得这些知识的?你订阅了哪些资源?只是问这样我也可以订阅它们。
2021-03-20 16:27:49
@Arjang 回答 StackOverflow 问题对于在实现或规范本身中找到各种奇怪的东西、浏览器怪癖和错误有很大帮助;-) 例如,我在stackoverflow.com/questions/41346772/... 中注意到了那个问题,但是然后我用stackoverflow.com/questions/52325435/...挖了这个,在这两者之间有stackoverflow.com/questions/43728379/...
2021-03-29 16:27:49