css - 标签是否延迟 DomContentLoaded 事件?
问题描述
我试图了解将“链接”标签放在“head”下与“body”下放置对 DomContentLoaded 事件时间的影响。我观察到,当 'link' 位于 'head' 下时,DomContentLoaded 在 DOM 准备好后立即触发,但当 'link' 位于 'body' 下时,在下载和解析 CSS 文件后触发事件。所以,我想知道为什么 DOMContentLoaded 在“链接”位于“正文”下时需要时间。
<!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。在此活动完成后,控件将再次返回给 HTML 解析器,如果这一次完成了完整的 HTML 解析;DOM 将准备就绪,并且将触发“DomContentLoaded”加载事件。
注意 -将链接标签放在“head”标签内时不会阻止 HTML 解析器,但放在“body”标签内时会阻止 HTML 解析。因此,DomContentLoaded 事件需要时间来触发,因为到那时完整的 DOM 还没有准备好。
推荐阅读
- r - 计算两个日期时间之间 15 分钟的序列出现
- r - 将 PCR 96 孔板转换为单列格式
- sql - 如何更改存储在 Postgres 中的 JSON 对象中所有记录的键名
- loops - Applescript:循环中的文本定界
- javascript - 从 Firebase 获取图片网址
- julia - ```@time``` 范围内的 UndefVarError 错误
- mysql - 选择单个结果或多个结果时的 sql 请求问题
- javascript - PHP 包含在 2 个网站上:一个工作,一个不工作
- sql - SQL:拆分字符串以连接表 更新
- ios - 如何修复条件绑定的初始化程序必须具有可选类型,而不是“字符串”?