JavaScript中的渲染何时更新?

问题描述 投票:1回答:1

我正在阅读html specs concerning web api's,基本上是说

事件循环从任务队列执行了某些任务之后,需要更新渲染(如果这是窗口事件循环)

还据说,用户代理可以通过某种方式告知不需要更新渲染(请参见上面链接中的第10.3节“不必要的渲染”)

所以我的问题如下:如果我有一个简单的index.html文件,并且仅附加了一个脚本文件-index.js

index.html

 <!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Test</title>
  </head>
  <body>
    Hello StackOverflow
    <script src="./index.js"></script>
  </body>
</html>

index.js

function add(a,b) {
    console.log(a+b);
}

function modifyBackground() {
    document.body.style = 'background : red';
}

console.log('Hello world'); // Task 1
add(4,5); // Task 2
modifyBackground(); // Task 3 Will the render be updated only here?

我以这种方式查看-index.js中包含3个任务。第一个任务是console.log任务,首先将其添加到事件循环中的任务队列中。然后是add任务,最后是modifyBackground任务。

理论上,如果用户代理无法知道我们是否确实需要更新渲染,则它应该在每个任务之后更新渲染。

仅当我在最后一行调用modifyBackground()方法时才会进行重新渲染吗?而且,如果是这样,用户代理如何告知不需要重新渲染?

P.S。如果您需要澄清,我想知道,例如google chrome的用户代理如何告知不需要重新渲染。

javascript specifications event-loop rerender
1个回答
0
投票

仅当我调用modifyBackground()时才会进行重新渲染最后一行的方法?

取决于浏览器的实现,有时它们不遵循规范。

并且,如果是这样,用户代理如何告知未重新渲染有必要吗?

同样,这取决于浏览器的实现。您需要了解浏览器渲染的工作方式。您可以查看以下很棒的解释:How the browser renders a Web Page。以下是简历。

有3个基本概念:

  1. DOM
  2. CSSOM
  3. 渲染树。

文档对象模型(DOM)

[当浏览器读取HTML代码时,只要遇到HTML元素(如html,body,div等),它就会创建一个称为Node的JavaScript对象。最终,所有HTML元素都将转换为JavaScript对象。由于每个不同的HTML元素都有不同的属性,因此将通过不同的类(构造函数)创建Node对象。

CSS对象模型(CSSOM)

构建DOM之后,浏览器从所有源(外部,嵌入式,内联,用户代理等)读取CSS并构建CSSOM。 CSSOM代表CSS对象模型,它是一个类似于DOM的树状结构。该树中的每个节点都包含该特定DOM元素的CSS样式信息。但是,CSSOM不包含无法在屏幕上显示的DOM元素,例如,等等。

渲染树

这里是您问题的答案。渲染树是一种通过合并DOM和CSSOM树而构建的树状结构。浏览器必须计算每个可见元素的布局并将其绘制在屏幕上,因为该浏览器使用Render-Tree。因此,除非未构建“渲染树”,否则屏幕上将不会打印任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.