<body> 中的 <link> 标记是否会延迟 DomContentLoaded 事件?

Does <link> tag in <body> delays DomContentLoaded event?

我试图了解将 'link' 标记放在 'head' 下 v/s 放在 'body' 下对 DomContentLoaded 事件计时的影响。 我观察到,当 'link' 低于 'head' 时,DomContentLoaded 在 DOM 准备就绪后立即触发,但是当 'link' 低于 'body' 时,事件在 CSS 文件被下载并解析。 所以,我想知道为什么 DOMContentLoaded 在 'link' 低于 'body' 时需要时间。

<!DOCTYPE html>
<html>

<head>
  <title>Rendering Understanding</title>
</head>

<body>
  <link rel='stylesheet' href='/stylesheets/style1.css' />
  <hr>
  <h2>
    Hello World!
  </h2>

</body>
</html>

我做了一些分析,在 chrome(76.0.3809.100) 中发现了以下观察结果:-

HTML 解析何时被阻止?

  • 当在 head 标签或 body 标签下遇到脚本标签时,html 解析器将停止解析并从网络获取请求的脚本,控制权将转到 JS 引擎。脚本将被解析然后执行,之后控制将返回到 HTML 解析器。因此,当再次开始解析并且这次解析完整的 HTML 时; DOM 将准备就绪,'DomContentLoaded' 加载事件将被触发。
  • 当在 'body' 标签内再次遇到 Link 标签时,HTML 解析将被阻止,直到从网络获取请求的样式表并创建 CSSOM。在此 activity 完成后,控制将再次返回给 HTML 解析器,如果这次完成 HTML 解析完成; DOM 将准备就绪,'DomContentLoaded' 加载事件将被触发。

注意 - Link 标签放在 'head' 标签内时不会阻止 HTML 解析器,但它会阻止 HTML 放在 'body' 标签内时解析。因此,DomContentLoaded 事件需要一些时间才能触发,因为到那时完整的 DOM 还没有准备好。