本文章是学习在“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