首先让我简单介绍一下它是如何加载的,然后就此提出问题。
浏览器抓取HTML => 解析HTML => 创建节点 => 解析节点并开始将它们转换为Dom元素 => 找到样式节点,然后开始创建CSSOM => 完成解析,如果有样式标记,则等待它构建CSSOM树 => 一旦完成,它会同时合并DOM和CSSOM,并触发DOMContentLoaded
事件。
总而言之,一旦CSSOM准备就绪,浏览器就会开始渲染,并且可以逐步添加Dom。
这一切都很好,但是当浏览器开始渲染页面时,如果没有加载整个html,流程是如何进行的...(例如在nodejs中你可以部分html然后等待2s再发送更多)
答案 0 :(得分:1)
事情可能会阻止DOMContentLoaded
事件,但这并不会阻止呈现不完整的页面。这对于从慢速服务器流式传输的很长页面来说非常重要。
浏览器可以并且执行交错脚本执行,重新样式化,使用文档解析进行渲染。这可以通过在<head>
中执行javascript并查询DOM来简单地显示,您将看到文档在DOMContentLoaded
事件之前不会拥有其所有节点(可能甚至不是body元素)烧成。
您必须将文档构造更多地视为流,而不是在下一个块开始之前运行完成的顺序执行的块。
答案 1 :(得分:0)
CSSOM停止解析。因此执行后续脚本标签,也延迟了渲染。
样式标签之前的脚本标签将在CSS从样式标签加载到CSSOM中之前执行。
脚本标签后面的样式标签会更改CSSOM。而且,如果脚本访问的样式已被更改,则其读取的内容已过时。订单很重要。
不仅停止渲染,而且停止解析。
JavaScript阻止分析,因为它可以修改文档。的CSS 无法修改文档,因此似乎没有理由 阻止解析,对吧?
但是,如果脚本要求提供尚未提供的样式信息怎么办? 解析了吗?浏览器不知道脚本要做什么 执行-它可能会要求类似DOM节点的背景色 这取决于样式表,或者可能期望访问CSSOM 直接。
因此,CSS可能会根据以下顺序阻止解析 外部样式表和文档中的脚本。如果有 外部样式表放置在文档中脚本之前, DOM和CSSOM对象的构造可能会相互干扰。 当解析器到达脚本标签时,无法进行DOM构建 直到JavaScript完成执行,并且JavaScript不能 执行,直到下载,解析CSS,并且CSSOM为 可用
。
答案 2 :(得分:0)
一些重要的事实:
DOMContentLoaded
在文档被 main 解析器完全解析并且 DOM 已经完全构建时被触发。<script>
(无论是外部的还是内联的),脚本的执行(不获取)会延迟,直到 CSS 的获取和解析完成即使脚本的获取更早完成,也已完成。原因是脚本可能依赖于要加载的 CSS 规则。所以浏览器必须等待。
仅在这种情况下,CSS 会间接阻止文档解析器和 DOM 构建。