script中脚本的加载和执行

本文章是学习在“html中使用javascript”写下的学习笔记,并且查阅了相关资料。

在html中嵌入javascript代码,两种形式:要么直接script标签里面写代码,要么把要写的js代码作为外部分拣嵌入使用src属性。

script在html4.01加入了6个属性:http://www.w3school.com.cn/tags/tag_script.asp

代码执行顺序,从上到下,从左到右,这个当然很清楚。红皮书上:在解释器对<script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载显示。通俗的说:就是当一个script标签被执行, 在它之前的HTML元素可以访问,之后的就不成。所以也就是为什么通常建议将script放在body结束标签之前,dom之后。

其中,type属性,不是必须,默认值就是text/javascript。

带有src属性的script标签里面,不应该在包含代码,否则会被忽略

其它属性很简单,重点说说defer和asyn,从而谈谈脚本在页面中是怎样的执行流程。

1.defer属性只适用于外部文件,asyn也是

2.defer:延迟脚本,async:异步脚本

3.defer就是同样的加载,但是其中包含的脚本将延迟到浏览器遇到</html>标签后执行,最后只包含一个延迟脚本。

4.async属于异步脚本,就是说告诉浏览器立即下载文件,但是和defer不同的是,async是加载完成就执行,和文档是异步的形式。

一般defer更加适用于现实场景。


其中蓝色代表js脚本网络加载时间,红色代表js脚本执行时间,绿色代表html解析。

很清楚的知道,如果我们存在的操作dom元素,那么一定确保在文档解析完成后再执行脚本,不然会获取不到。

这里比较的是脚本的正常执行和加入defer属性或者说async属性。

经常我们会看到window.onload,这个怎么个加载顺序呢?

load事件的触发就是页面完全加载完毕,通defer貌似一样呢,那谁先执行?



由此可以看到先执行defer属性,然后是onload

那么还有我们经常使用jquery框架的$(fucntion(){}) 完整写法就是 $(document).ready(function(){}); 意思是dom加载完成后执行。首先$(function(){})不会被覆盖,window.onload会被覆盖,这个理解函数就知道为什么呢


结果:


因此可以看到,$(function(){})先执行,并且不会被覆盖。就相当于原生js的DOMContentLoaded事件,在DOM加载完毕后,页面全部内容加载前(如图片等)执行,而window.onload是页面所有资源加载完成后才执行。defer都会在这两个之前

DOM文档加载步骤: 
1.解析HTML结构 
2.加载外部的脚本和样式文件 
3.解析并执行脚本代码 
4.执行$(function(){})内对应代码 
5.加载图片等二进制资源 
6.页面加载完毕,执行window.onload

参考:

    http://www.cnblogs.com/neusc/archive/2016/08/12/5764162.html

    https://www.cnblogs.com/lizonghui/archive/2012/09/13/2683706.html

    http://blog.csdn.net/zp1996323/article/details/50281397



猜你喜欢

转载自blog.csdn.net/viewyu12345/article/details/79635883