dom加载和js执行的时间先后

本文详细介绍了浏览器加载网页的过程,包括HTML解析、样式表加载、JS执行及DOM构建等关键步骤,并对比了load与ready的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浏览器的渲染和操作顺序如下:

  1. html解析完毕
  2. 外部脚本和样式表加载完毕
  3. 脚本在文档内解析并执行
  4. html dom完全构造起来
  5. 图片和外部内容加载

(以上内容来源于<精通javascript>一书)

对于外部js文件来说,先加载外部js文件,然后执行js代码,DOM加载并不能保证在其执行前加载完毕。

而行内js,由于按照顺序执行,在js代码执行时,位于行内js之前的元素,其对应的dom节点都可以建立起来。比如

  <ul>
                        <li><a href="javascript:;" class="js-sysAnnouncement">系统公告</a></li>
                        <script>
                            .....
                        </script>
                    </ul>

则在js之前的li元素所对应的dom节点已经加载完毕。

-----------------------------------------------------------------------------------------------

前几天遇到一个问题:load和ready 哪个先执行?

针对这个问题我自己研究学习了一下DOM文档的加载步骤:

    1.首先浏览器会解析静态的html结构 比如 head body footer等html标签

    2.当html结构加载完成我们需要渲染页面使其美观,因此此时需要加载 各种样式表文件。

    3.然后再解析并执行js或者其他脚本代码。

    4.构造html DOM对象,也就是 ready 操作

    5.加载html和css中引用的外部资源文件。

    6.页面加载完成(load操作),js进行一些事件的绑定和处理。

通过这个执行顺序我们知道 ready与load的区别在于资源文件的加载。ready构建了基本的DOM结构,而load是构建了js事件的绑定以及操作。所以页面在加载时需要先加载CSS样式表后加载解析并执行js等脚本,所以我们对页面进行优化是,css文件越早加载越好。js资源当道dom的底部最晚加载越好。


### HTML、CSS JS加载顺序解析 #### 1. HTML 文件的解析过程 当浏览器开始加载一个 HTML 页面时,它会按照文档流从上到下依次解析 HTML 代码。在这个过程中,如果遇到 `<link>` 标签引入的外部 CSS 文件或者 `<script>` 标签引入的 JavaScript 文件,浏览器的行为会发生变化。 - 当解析到 `<head>` 部分时,如果发现有 `<link rel="stylesheet">` 标签,则会发起对 CSS 文件的请求,并暂停后续 DOM渲染直到该样式表被完全加载解析完毕[^1]。 - 如果在 HTML 中存在不带 `async` 或者 `defer` 属性的标准 `<script>` 标签,那么一旦遇到这些标签,HTML 解析器就会停止工作,转而执行对应的 JavaScript 脚本[^2]。 #### 2. CSS 对 HTML 加载的影响 尽管 CSS 不会阻止 DOM Tree 的构建(即可以继续创建 DOM 结构),但它确实会影响页面的实际可见性——也就是所谓的 **首次绘制时间** (First Paint Time)。这是因为 Render Tree 的生成既依赖于完整的 DOM Tree 又需要 CSSOM Tree 完成之后才能进行布局计算与绘图操作[^3]。 ```javascript // 假设如下情况下的测试代码 console.log(document.getElementById('myElement')); // 输出 null ``` 上面这段简单的例子展示了如果没有先处理好所有的 CSS 规则就运行某些特定类型的 JavaScript 函数可能会得到意想不到的结果,因为此时可能还未建立正确的视觉表现层结构[^3]。 #### 3. JavaScript 的行为模式及其影响因素 JavaScript 默认情况下具有同步特性,在其被执行期间任何其他资源包括图片在内的进一步下载都将暂时搁置直至当前脚本块结束为止。然而通过设置额外参数如 `defer` 或者 `async` ,我们可以改变这种默认机制: - 使用 `defer`: 这种方式允许 HTML 文档持续解析而不被打断的同时异步加载指定 js 文件,最终等到整个 html body 元素闭合后再按原始定义次序逐一调用各个 defer script[]^2]^. - 应用 `async`: 此选项使得关联 javascripts 尽量早些时候启动但并不保证它们之间遵循书写位置上的先后关系;而且即便如此也仅限于是非阻塞性别的独立片段而已[^2]. 综上所述,对于标准配置而言,首先是 HTML 自身逐步形成 dom tree , 接着依据 link href 获取 css 并组建 cssom tree 。最后才是常规意义上的 inline/block level scripts 执行阶段或者是那些标记了 special flags(deffer/async) 后特殊对待的情形. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值