script 标签
JS 在浏览器中的使用, 肯定会涉及到 script 标签.
那么 script 标签有哪些属性呢?
1.async: 异步加载 (不让页面等待该脚本的加载执行, 异步加载页面的其他部分)
2.charset: 设置 JS 的字符集编码
3.defer: 延迟脚本 (当浏览器解析到 / html 结束标签时才执行, 该属性对嵌入脚本无效)
4.language: 代码所使用的脚本语言 (已废弃)
5.src: 要执行的外部代码文件
6.type: 与 language 类似可以看作是 language 的替代属性
在上面的这些属性中 src 就不用过多的说明了, 除了 src 使用较多, 并且应用范围较广的就是 async 和 defer 了
下面将主要分析一下这两个属性
首先是 defer
根据说明, 设置了该属性的 script 外部文件会在解析到 </HTML > 标签的时候才开始执行, 并且会在 DOMcontentonload 之前触发
而且根据 html5 的要求这些延迟脚本会按照在文档中的顺序执行
DOM 文档加载步骤:
(1) 解析 HTML 结构
(2) 加载外部脚本和样式表文件
(3) 解析并执行脚本代码
(4) 构造 HTML DOM 模型 //DOMContentLoaded 执行点
(5) 加载图片等外部文件
(6) 页面加载完毕 //load
我们来测试一下
首先新建一个简单的 HTML 页面
- <!DOCTYPE HTML>
- <HTML lang="zh">
- <head>
- <title>title</title>
- <meta charset="utf-8"/>
- <meta name="Description" content=""/>
- <meta name="Author" content="巽秋"/>
- <style type="text/CSS"></style>
- <script src="./1.JS"></script>
- <script src="./2.JS"></script>
- </head>
- <body>
- <script>
- Windows.addEventListener("DOMContentLoaded", function () { // 添加 DOMContentLoaded 事件
- console.log("domContentLoad 执行");
- }, false);
- console.log("这里是嵌入脚本");
- </script>
- </body>
- </HTML>
引入的外部 JS 文件代码如下:
- console.log("这里是外部脚本 1");//1.JS 中的内容
- console.log("这里是外部脚本 2");//2.JS 中的内容
我们打开该页面结果如下:
我们可以看到 DOMContentLoaded 是在 JS 代码执行完后执行的
现在我们再给外部引入的两个 JS 文件加上 defer 属性
再次运行查看结果
我们可以看到嵌入脚本比 1.JS 和 2.JS 先执行了并且在 domcontentloaded 事件触发之前就执行完毕了
和我们预先预测的结果一致.
接下来我们再看一下, 这两个外部文件的执行顺序是否真的和在页面中出现的顺序一致
我们交换一下两个 script 标签的引入的位置
再看一下结果
说明 defer 的延迟脚本的加载顺序和该脚本在页面中出现的顺序是一致的
说明的确是这样的
不过书中说实际上有可能不一定是这样的, 所以我又换了几个浏览器试试
刚才的是 Chrome 浏览器的结果
这是火狐浏览器的结果
这是 ie11
ie10
虽然在低版本 IE 中 addEventlistenter 有兼容问题但是我们可以看到 defer 脚本的加载顺序并没有什么改变
所以我也不知道在什么情况下延迟脚本会不遵守这个规则
然后是 async
书中给出的描述是有该属性的脚本, 立即加载并执行, 页面的其他部分异步加载
并且 async 属性的标签一定会在 Windows.onload 之前执行, 可能会在 domcontentloaded 之后执行
该属性的脚本不会按顺序到来, 所以在使用时需要确保该属性的脚本之间没有依赖关系
首先给之前引入的两个标签的 defer 改为 async 属性
然后加上 Windows.onload 事件
再来看一下结果
- <!DOCTYPE HTML>
- <HTML lang="zh">
- <head>
- <title>title</title>
- <meta charset="utf-8"/>
- <meta name="Description" content=""/>
- <meta name="Author" content="巽秋"/>
- <style type="text/CSS"></style>
- <script src="./2.JS" async></script>
- <script src="./1.JS"async></script>
- </head>
- <body>
- <script>
- Windows.addEventListener("DOMContentLoaded", function () { // 添加 DOMContentLoaded 事件
- console.log("domContentLoad 执行");
- }, false);
- Windows.onload = function(){
- console.log("Windows.onload 执行");
- };
- console.log("这里是嵌入脚本");
- </script>
- </body>
- </HTML>
结果如下
这里由于页面异步加载所以
嵌入脚本先执行了
异步脚本在 domcontentloaded 之后执行的
我为了测试不按顺序到来
我给两个 JS 的 consle 之前加了循环
来控制加载的时间
看看异步脚本是谁先加载完就先执行吗?
我在 2.JS 的后面粘贴了 jq1.12.4 的代码
让 2.JS 比 1.JS 文件要大 但是 console 都是第一句代码
2.JS 还会先 console 吗?
我们再来看看结果
结果很显然
async 属性的脚本应该是谁先加载完谁就先执行, 并且不管怎样一定会在 Windows.onload 事件之前执行
noscript 标签
当浏览器没有 JS 环境, 或者 JS 被关闭的时候我们往往需要给用户一些提示之类的
那么这就是 noscript 标签的作用
我们再建一个新的 HTML 页面
- <!DOCTYPE HTML>
- <HTML lang="zh">
- <head>
- <title>title</title>
- <meta charset="utf-8"/>
- <meta name="Description" content=""/>
- <meta name="Author" content="巽秋"/>
- <style type="text/CSS"></style>
- </head>
- <body>
- <noscript > 您的浏览器未开启 JS</noscript>
- <script>
- console.log("JS");
- </script>
- </body>
- </HTML>
我们打开这个页面
我们可以看到在 JS 开启的情况下 noscript 标签中的内容是不会显示的
我接下来关闭 JS
然后刷新页面
今天就记录一下 script 标签吧
写完, 收工.
来源: https://www.cnblogs.com/lhyxq/p/9711538.html