根据延迟属性MDN 说:
此布尔属性设置为向浏览器指示脚本将在文档被解析之后但在触发 DOMContentLoaded 之前执行。defer 属性只能用于外部脚本。
在DOMContentLoaded
MDN 上还说:
DOMContentLoaded 事件在初始 HTML 文档完全加载和解析后触发,无需等待样式表...
所以在准备好DOMContentLoaded
之前被解雇。CSSOM
这意味着延迟脚本在准备好之前执行。CSSOM
但如果这是真的,则脚本必须无法获得正确的 CSS 属性值,并且不能正确应用 CSS。但这不是真的,我们知道所有延迟脚本都运行良好。
- 那么 MDN 文档在技术上是不正确的吗?
- 在哪里可以找到 DOMContentLoaded 的官方文档?我在https://dom.spec.whatwg.org/中搜索但找不到。
PS:请注意,谷歌说CSSOM 是在执行任何内联 javascript 之前构建的
但谷歌在技术上是不正确的。内联 JavaScript 在 CSSOM 准备好之前执行。从我的测试中,我发现 MDN 是正确的,如果 js 文件(延迟和非延迟)在 CSS 文件(或 js 是内联的)之前下载,那么 js 在 CSSOM 准备好之前执行。所以 js 可能会错误地处理样式。为了避免这种情况,我们需要在所有 js 逻辑之前强制回流。
因此,如果用户访问我们的网站时所有需要的 js 都已缓存并且 CSS 未缓存或 js 在 CSS 之前下载,那么他可能会看到一个错误呈现的页面。为了避免这种情况,我们应该在我们所有网站的 js 文件中添加强制回流。