【发布时间】:2017-08-14 12:05:35
【问题描述】:
根据延迟属性MDN says:
此布尔属性设置为向浏览器指示脚本应在文档被解析之后执行,但在触发 DOMContentLoaded 之前。 defer 属性只能用于外部脚本。
开启DOMContentLoadedMDN also says:
当初始 HTML 文档完全加载和解析后触发 DOMContentLoaded 事件,无需等待样式表...
所以DOMContentLoaded 在CSSOM 准备好之前被触发。这意味着延迟脚本在CSSOM 准备好之前执行。但如果这是真的,则脚本必须无法获得正确的 CSS 属性值,并且不能正确应用 CSS。但这不是真的,我们知道所有的延迟脚本都能正常工作。
- 那么 MDN 文档在技术上不正确吗?
- 在哪里可以找到 DOMContentLoaded` 的官方文档?我在https://dom.spec.whatwg.org/ 中搜索过,但找不到。
P.S: 请注意google says CSSOM 是在执行任何内联 javascript 之前构建的
但 Google 在技术上是不正确的。内联 JavaScript 在 CSSOM 准备好之前执行。从我的测试中,我发现 MDN 是正确的,如果 js 文件(延迟和非延迟)在 CSS 文件(或 js 是内联的)之前下载,那么 js 在 CSSOM 准备好之前执行。所以 js 可能会错误地处理样式。为了避免这种情况,我们需要在所有 js 逻辑之前进行强制回流。
因此,如果用户访问我们的网站时所有需要的 js 都已缓存并且 CSS 未缓存或 js 在 CSS 之前下载,那么他可能会看到一个错误呈现的页面。为了避免这种情况,我们应该在我们所有网站的 js 文件中添加强制回流。
【问题讨论】:
-
在stackoverflow.com/q/42891628/3429430也进行了相关讨论
标签: javascript html css dom cssom