在下面的代码中:
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<span>1111</span>
<script>
alert("1");
</script>
<span>22222</span>
<script>
alert("2");
</script>
<span>Hello World</span>
<script>
alert("Hello World");
</script>
</body>
</html>
在body标签中,有一些span标签,每个span标签后面都有一个script标签。在每个脚本标签中只有一个警报。
当我通过浏览器打开这些代码时,我希望跨度标签在警报之前执行(呈现)。因为跨度在警报之前(警报在跨度之后!)
但是在真正的测试中,它并不像我预期的那样(首先显示警报,然后会出现跨度。) 为什么?!
加载页面时,浏览器将渲染并“绘制”页面,直到遇到阻塞资源。同步 JavaScript 是阻塞渲染的。在这种情况下,警报会被同步调用并阻止页面呈现。
运行您的代码时,我的浏览器被前两个警报阻止,但已解析足够的 HTML 来呈现“1111”和“22222”元素,然后再次被第三个警报“hello world”阻止。
这里有一些相关阅读:
A
<span>
元素是 HTML。 alert()
是 window
对象的方法,而不是真正的 JavaScript。换句话说,alert()
是对 window
对象的 API 调用。 window
对象由浏览器的核心编程(用本机代码编写)而不是 JavaScript 运行时处理。浏览器的核心编程处理速度比 JS 代码快得多,因此,有时当您调用 window
API 时,提供结果的速度比 HTML 解析器或 JS 运行时更快。对于 alert()
,它是一个模式对话框并阻止 UI 更新,因此处理速度比 span
元素的渲染速度更快。
加载页面时,浏览器在接收和处理代码时开始显示和处理该页面。在这种情况下,当浏览器遇到该标签时,它会执行其内容,然后继续显示页面。
要更改此行为,您可以使用特殊属性,例如 defer。