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

kkk*_*kkk 2 javascript dom

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

const newChildNode = /*...*/;

document.body.appendChild(newChildNode);

const newHeight = document.body.scrollHeight;
Run Code Online (Sandbox Code Playgroud)

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

Kai*_*ido 8

我们可以把这个"重绘" 3个部分过程中,DOM更新,回流,重新绘制.

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

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

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

重绘:当事物实际传递给渲染引擎时.规范中没有任何内容说明何时会发生这种情况.大多数浏览器都会等待下一次屏幕刷新,但并不是说它总是会像那样.例如,当你用alert()Firefox 阻止脚本执行时,Chrome就会因为没有触发它而闻名.

  • “Chrome 因不会触发它而闻名。Fireox”人们到底是怎么找到这个东西的?谁知道这些东西或者如何获得这些知识?您订阅哪些来源?只是询问以便我也可以订阅它们。 (2认同)
  • @Arjang 回答 StackOverflow 问题有助于在实现或规范本身中找到各种奇怪的东西、浏览器怪癖和错误;-) 例如,我注意到了 /sf/ask/2894274071/ /how-do-i-know-when-html5-canvas-rendering-is-finished/41347460#41347460,但后来我用/sf/ask/3662780481/挖掘了这个loop-does-not-block-css-animation/52326008 和中间有 /sf/ask/3060986561/ (2认同)