前端的纯技术是对规范的认识。

domcontentloaded的事件是什么

想的第一件事就是看看W3C HTML5规范,当domcontentloaded事件触发。


一旦用户代理停止解析文档,用户代理必须

1。将当前文档准备设置为交互式,并将插入点设置为

将所有节点从打开的元素堆栈中弹出。

2。如果在文档中执行的脚本列表

2.1,将事件循环旋转到列表中的第一个脚本,它也是系统的主体。

2.2在将执行的脚本列表中执行第一个脚本

2.3,从脚本列表中删除第一个脚本元素,它也被称为正确的方法。

2.4如果在文档执行时将执行的脚本列表。

三.队列任务的简单事件,泡沫消防domcontentloaded命名


规范总是默默无闻,但至少有一点可以明确,即当JS(不含动态插入js)执行时,它会触发domcontentloaded事件。

接下来,看看在domcontentloaded事件在MDN文档:


的domcontentloaded事件被激发时,文档已经完全,,

注:样式表加载块脚本执行,所以如果你有一个,你,如果执行脚本,等等。


这样,至少有一个理论可以得出:该domcontentloaded事件本身并不等待CSS文件,图片和iframe负荷要做。

触发时间是:加载页面后,解析所有标记(不包括CSS和js),并设置规范中指定的交互式,并在每个静态脚本标记中执行js,然后触发。

js的执行需要等待它前面的CSS加载(如果是外部连接)并执行它,因为js可能依赖于前面计算的CSS。

实践是检验真理的唯一标准。

实验1:domcontentloaded事件不等待的CSS文件和图片来完成加载

Index.html:










内容









图1

如果网页上有没有脚本标签的domcontentloaded事件不等待的CSS文件被加载,图片加载。

Chrome开发者工具的时间轴面板可以帮助我们记录浏览器的运动。在蓝线图一个红色的小盒子,这domcontentloaded事件表示,这是对红色线和绿色线荷载分别先画事件吧,会有下面的老鼠灰盒小部分悬停与文字提示线(这种互动足够的反人权!)。

实验2:domcontentloaded事件需要等待才能触发触发器执行的JS

Index.html:








Console.timeStamp('inline脚本之前连接头);
Window.addEventListener('domcontentloaded,函数(){(){
Console.timeStamp('domcontentloaded事件);
});



Console.timeStamp('inline脚本链接在头后);



内容






Main.js:

Console.timeStamp('external脚本链接在身体后);





图2

如果脚本标签是静态的网页上写的,这domcontentloaded事件需要等待才触发执行的JS。

脚本标记中的js需要等待它前面的CSS的加载。

Console.timeStamp()可以添加一条记录的时间和对应的黄线以上。

从图2中,我们可以看到js在CSS之前被立即执行,CSS之后的js必须等到CSS被加载为止。那么很明显,main.js已经加载,但它仍然要等到main.css装,domcontentloaded事件是JS执行后触发。时间轴面板显示区域的滑动块,如图三所示,你可以看到,domcontentloaded事件的蓝线放大后(前用黄色线和绿色线太近),当然,通过console.timestamp()添加到记录中的时间也可以证明的触发时间。





图三

现代浏览器将同时预装CSS,js,这是对这些资源的并发请求。但是,执行CSS和js的顺序是依赖于最初的顺序(js的执行需要等待CSS和js在前面加载和执行)。

实验3:什么时候IMG开始解码和画的吗



从图3中我们可以发现一个有趣的地方:IMG发出请求,但被推迟了一段时间开始解码。如图2和红框如图3所示,只有一部分的截图,截图中显示。事实上,这些解码记录持续到IMG加载结束。如图四所示,IMG则在负载侧。





图三

现代浏览器将同时预装CSS,js,这是对这些资源的并发请求。但是,执行CSS和js的顺序是依赖于最初的顺序(js的执行需要等待CSS和js在前面加载和执行)。

实验3:什么时候IMG开始解码和画的吗

从图3中我们可以发现一个有趣的地方:IMG发出请求,但被推迟了一段时间开始解码。如图2和红框如图3所示,只有一部分的截图,截图中显示。事实上,这些解码记录持续到IMG加载结束。如图四所示,IMG则在负载侧。



图四

抱着怀疑来验证这个想法,我想这是因为如果IMG资源需要显示,执行所有的JS和CSS需要知道的,因为main.js可能执行一些DOM操作,IMG元素如删除或修改其src属性,和CSS可以显示:无。



图五



图六



图七

没有JS和CSS在图5中,当收到IMG的数据,它开始解码。

有图六没有JS,但IMG不开始直到CSS完成解码。

图七和图六的代码的代码之间的唯一区别是,CSS给IMG显示:无;这使得IMG虽然是请求,但并不是在所有的破译。

这说明无论IMG需要解码,画(油漆),不需要等待CSS加载并执行知道。也就是说,将CSS块IMG的显示!那JS呢



图八

与图八相应的代码:








Console.timeStamp(在头'inline脚本);
Window.addEventListener('domcontentloaded,函数(){(){
Console.timeStamp('domcontentloaded事件);
});



内容






在JS和CSS页面没有这是惊人的,IMG可以开始解码和绘制(涂料)后立即接收数据,也就是说,JS不块IMG的显示。这是不是说我们以前的了解JS将块IMG资源的传统观念一样,它似乎Chrome已经制造了一个新的优化加载和展示图片。

常用的jQuery的$(document)。Ready()方法是监测domcontentloaded事件。当然,它也将通过模拟domcontentloaded onload事件事件和监测提供降级方案。它通常是建议登记为DOM元素的事件时,domcontentloaded事件触发。所以只要domcontentloaded事件被触发,这意味着页面可以互动,尽快。

减少CSS文件的容量,将单个CSS文件分成几个文件进行并行加载,并减少CSS对JS的阻塞时间。

二js文件是通过动态地插入script标签加载(动态插入的脚本标签不块的domcontentloaded事件触发)

使用CSS精灵图可以载入IMG的预加载HTML和CSS文件

在实验过程中,对Chrome开发者工具时间轴面板是非常强大的,所有的浏览器都有记录。我们想了解和探讨内部浏览器的开发行为,或摸着石头做的黑盒测试,或一半的浏览器源代码,唯一的途径是研究别人的经验高一点,看到外国人的文章,但是浏览器(如实验表明,发展变化迅速找到JS非阻塞的IMG的别人的经验),不一定是最新的、最适合的,关键是要结合自己的业务需求,根据现场情况,做了分析和优化对。

PS。

以上的测试环境是Windows /铬、招潮是用来模拟慢速网络