Inside HTTP —— 资源下载次序与执行

本文深入分析了网页资源加载顺序,重点讨论了IE6与FF浏览器在下载外部资源时的不同策略,以及JS脚本的执行顺序与渲染过程。详细展示了JS运行、页面事件触发及资源下载的流程,并指出`defer`属性的作用与限制。

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

下载资源顺序

主文档当然是第一个下载,其次

IE6是按html中定义的文档流顺序来下载外部资源,从上至下.

FF则略有不同,FF会优先下载jscss,而图片资源延迟到后面下载.

(经测试IE7,IE8也是先下载jscss,其它资源延后下载)

 

 

渲染或解析(DOM)

 

对于 js 运行,以及页面加载相关事件的触发,特别做了测试。在 Firefox 下,打开测试页面:

 

(以下测试数据来自互联网)

 

[22:13:32.947] HTML Start

[22:13:32.947] normal inline script run time

[22:13:34.904] normal external script run time

[22:13:35.775] [body] normal external script run time

[22:13:35.789] [body end] normal external script run time

[22:13:35.789] HTML End

[22:13:35.791] deferred inline script run time

[22:13:35.791] deferred external script run time

[22:13:35.793] DOMContentLoaded

[22:13:38.144] images[0] onload

[22:13:38.328] images[1] onload

[22:13:39.105] images[2] onload

[22:13:39.105] images[3] onload

[22:13:39.106] window.onload

 

很明显,JS 的运行严格按照文档流中的顺序进行。其中 deferred 的脚本会在最后运行(注:Firefox 3.5 开始支持 defer,而且支持得很完美)。

 

再来看下 IE8,结果如下:

 

[22:33:56.806] HTML Start

[22:33:56.826] normal inline script run time

[22:33:57.786] normal external script run time

[22:33:57.812] deferred inline script run time

[22:33:57.816] document.readyState = interactive

[22:33:57.934] [body] normal external script run time

[22:33:58.310] [body end] normal external script run time

[22:33:58.310] HTML End

[22:33:58.346] deferred external script run time

[22:33:58.346] images[0].readyState = loading

[22:33:58.346] images[0].readyState = complete

[22:33:58.346] images[0] onload

[22:33:58.361] doScroll

[22:33:58.451] images[1].readyState = loading

[22:33:58.479] images[1].readyState = complete

[22:33:58.479] images[1] onload

[22:33:58.794] images[2].readyState = loading

[22:33:58.854] images[2].readyState = complete

[22:33:58.854] images[2] onload

[22:33:58.876] images[3].readyState = loading

[22:33:58.876] images[3].readyState = complete

[22:33:58.876] images[3] onload

[22:33:58.887] document.readyState = complete

[22:33:58.888] window.onload

 

可以看出,IE8 下,defer 只对 external 脚本有效,对 inline 脚本无效。

 

 

css下载和渲染几乎是同时进行的.即下载完成后会立即渲染到页面.

当某一脚本下载完成时,也会立刻解析和运行。脚本的运行严格按照文档流中的顺序进行,deferred 的脚本会在正常脚本运行之后运行,

所以特别注意js脚本放置顺序.如果第二个外部脚本中直接调用运行第一个外部脚本中的全局变量时,会产生脚本错误.

特别需要留意:脚本运行时,会暂停该脚本之下所有资源的下载(因为脚本可能改变文档流,甚至跳转页面,浏览器的暂停策略是合理的)。

 

至于DOM的渲染是根据浏览器的渲染引擎来决定的.

这里可以了解各个浏览器的渲染引擎 :http://www.mac52ipod.cn/post/Trident-Gecko-WebKit-Presto.php

 

ps:defer是个很有用的东西,当某个脚本被标识为defer=true时,浏览器下载完该脚本后,不会立即执行该脚本,而是对其它资源进行下载和解析.

默认情况下,deferfalse,所以尽量不要在标识deferjs块或外部js文件中使用全局变量.

例子

<script type="text/javascript">

alert(a);

 

</script>

<script type="text/javascript">

var a=3

</script>

 

该脚本会报a未定义的错误,如果将第一个脚本块增加 defer=true标记,即可正常运行.所以说加上 defer 有点类似于 window.onload,但比onload灵活!

<script type="text/javascript" defer> //等同于defer=true

alert(a);

</script>

 

defer目前好像只支持  ie系列,ff3.5+浏览器(其它未测),所以使用时请注意兼容性问题

 

 

CH341A编程器是一款广泛应用的通用编程设备,尤其在电子工程和嵌入式系统开发领域中,它被用来烧录各种类型的微控制器、存储器和其他IC芯片。这款编程器的最新版本为1.3,它的一个显著特点是增加了对25Q256等32M芯片的支持。 25Q256是一种串行EEPROM(电可擦可编程只读存储器)芯片,通常用于存储程序代码、配置数据或其他非易失性信息。32M在这里指的是存储容量,即该芯片可以存储32兆位(Mbit)的数据,换算成字节数就是4MB。这种大容量的存储器在许多嵌入式系统中都有应用,例如汽车电子、工业控制、消费电子设备等。 CH341A编程器的1.3版更新,意味着它可以更多的芯片型号兼容,特别是针对32M容量的芯片进行了优化,提高了编程效率和稳定性。26系列芯片通常指的是Microchip公司的25系列SPI(串行外围接口)EEPROM产品线,这些芯片广泛应用于各种需要小体积、低功耗和非易失性存储的应用场景。 全功能版的CH341A编程器不仅支持25Q256,还支持其他大容量芯片,这意味着它具有广泛的兼容性,能够满足不同项目的需求。这包括但不限于微控制器、EPROM、EEPROM、闪存、逻辑门电路等多种类型芯片的编程。 使用CH341A编程器进行编程操作时,首先需要将设备通过USB连接到计算机,然后安装相应的驱动程序和编程软件。在本例中,压缩包中的"CH341A_1.30"很可能是编程软件的安装程序。安装后,用户可以通过软件界面选择需要编程的芯片类型,加载待烧录的固件或数据,然后执行编程操作。编程过程中需要注意的是,确保正确设置芯片的电压、时钟频率等参数,以防止损坏芯片。 CH341A编程器1.3版是面向电子爱好者和专业工程师的一款实用工具,其强大的兼容性和易用性使其在众多编程器中脱颖而出。对于需要处理25Q256等32M芯片的项目,或者26系列芯片的编程工作,CH341A编程器是理想的选择。通过持续的软件更新和升级,它保持了现代电子技术同步,确保用户能方便地对各种芯片进行编程和调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值