gpt4 book ai didi

javascript - 为什么浏览器并不总是在执行 JavaScript 之前完成对前面 HTML 的渲染?

转载 作者:太空狗 更新时间:2023-10-29 14:21:50 24 4
gpt4 key购买 nike

问题是关于下面的代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
One line of HTML code
<script>
// Synchronous delay of 5 seconds
var timeWhile = new Date().getTime();
while( new Date().getTime() - timeWhile < 5000 );
</script>
</body>

我在 Firefox 和 Chrome 中对其进行了测试,它们显示(呈现):“一行 HTML 代码”在 5 秒后而不是在 5 秒内。为什么浏览器会这样做?

我理解为什么浏览器在执行 JavaScript 时必须停止渲染,因为您可以使用 JavaScript 更改元素的样式(作为示例)。如果浏览器必须恰好在同一时刻显示和更改内容,就会出现问题。这就是浏览器在执行 JavaScript 时阻止渲染的原因。

在上面的例子中,当开始执行 JavaScript 时,“一行 HTML 代码”已经被“HTML 解析器”解析了。它必须这样做,因为 JavaScript 可以包含例如 document.write,因此附加的字符串必须位于前面的 HTML 之后。显然,在“解析 HTML”和显示/呈现相同的 HTML 之间有一些时间,否则本示例中的浏览器会在 5 秒内显示一些内容,但事实并非如此。

当你用很多HTML代码替换“一行HTML代码”时,浏览器会在5秒内已经显示一些内容,所以原则上已经显示一些内容是可能的。

如果我是浏览器,我会这样做:

  • 解析“一行html代码”
  • 看到一些 JavaScript block
  • 完成渲染 HTML,在“JavaScript block ”之前,因此浏览器将在此时显示:“一行 HTML 代码”
  • 现在暂停渲染并执行 JavaScript 代码。
  • 执行JavaScript代码后,重新开始渲染。

在这样的例子中,浏览器可以提前 5 秒显示一些内容。就渲染而言,这是一个很大的速度提升。

也许这是浏览器可以改进的地方,但也许还有其他原因。也许有人对此了解更多并可以向我解释。

最佳答案

尝试将上例中的内联 javascript 外部化。

在内联脚本中,运行脚本会占用时间,这可能会更改 DOM。尝试在 DOM 发生变化时渲染它会导致一团糟。所以渲染只发生在 JS 停止的时候,因此 DOM 是稳定的。

在等待外部脚本下载时,脚本的运行停止,因此 DOM 可以安全地呈现。渲染完成后才会运行下载的 JS。

希望对您有所帮助!

问候,埃比

关于javascript - 为什么浏览器并不总是在执行 JavaScript 之前完成对前面 HTML 的渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46931030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com