Javascript高级编程学习笔记(2)—— Script标签
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>
window.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属性的标签一定会在window.onload之前执行,可能会在domcontentloaded之后执行
该属性的脚本不会按顺序到来,所以在使用时需要确保该属性的脚本之间没有依赖关系
首先给之前引入的两个标签的defer改为async属性
然后加上window.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>
window.addEventListener("DOMContentLoaded", function () { //添加DOMContentLoaded事件
console.log("domContentLoad执行");
}, false);
window.onload = function(){
console.log("window.onload执行");
};
console.log("这里是嵌入脚本");
</script>
</body>
</html>
结果如下

这里由于页面异步加载所以
嵌入脚本先执行了
异步脚本在domcontentloaded之后执行的
我为了测试不按顺序到来
我给两个js的consle之前加了循环
来控制加载的时间
看看异步脚本是谁先加载完就先执行吗?
我在2.js的后面粘贴了jq1.12.4的代码
让2.js比1.js文件要大 但是console都是第一句代码
2.js还会先console吗?
我们再来看看结果

结果很显然
async 属性的脚本应该是谁先加载完谁就先执行,并且不管怎样一定会在window.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标签吧
写完,收工。
Javascript高级编程学习笔记(2)—— Script标签的更多相关文章
- Javascript高级编程学习笔记(3)—— JS中的数据类型(1)
前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...
- Javascript高级编程学习笔记(43)—— 动态脚本
动态脚本 大多数情况下,DOM操作都很简洁明了 因为DOM主要就是用来操作页面中的可视节点的 但有些时候我们又希望可以动态的来进行DOM操作 其中的一部分也就是今天我们的内容动态脚本 动态脚本是什么意 ...
- Javascript高级编程学习笔记(48)—— HTML5
HTML变动最大的版本应该就是HTML5了,这里就介绍一些 HTML5新增的DOM相关的API 与类相关的扩充 HTML4在普及后有一个十分重要的变化,即class属性使用的场景越来越多 所以HTML ...
- Javascript高级编程学习笔记(98)—— WebGL(4) WebGL上下文(2)
错误 Javascript与WebGL之间的一个最大区别在于,WebGL的操作一般不会抛出错误 如果希望获取WebGL的错误信息,那么就需要手动调用 gl.getError() 方法 该方法会返回以 ...
- Javascript高级编程学习笔记(61)—— 事件(5)UI事件
UI事件 UI事件是指那些不一定与用户操作有关的事件 这些事件在DOM规范出现之前,都是以各种不同的形式存在于不同的浏览器 而在DOM事件中为了保证向后兼容,现有的UI事件如下: DOMActivat ...
- Javascript高级编程学习笔记(6)—— 流程控制语句
话不多说,我们直接开始进入今天的主题 流程控制语句 首先什么是流程控制语句呢? 顾名思义,就是控制流程的语句. 在JS中语句定义了ECMAScript中的主要语法,让我们可以使用一系列的关键字来完成指 ...
- JavaScript高级编程学习笔记(第三章之一)
继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...
- Javascript高级编程学习笔记(97)—— WebGL(3) WebGL上下文(1)
WebGL上下文 在支持WebGL的浏览器中,WebGL的名字为 "experimental-webgl",这是由于 webgl 的规范仍未制定完成 制定完成后名字就会改为简单的 ...
- Javascript高级编程学习笔记(96)—— WebGL(2) 类型化视图
类型化视图 类型化视图一般也被认为是一种类型化数组. 因为其元素必须是某种特定的数据类型,类型化视图都继承自 Dataview Int8Array: 表示8位二补整数(即二进制补数) Uint8Arr ...
随机推荐
- 深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expand_dim(增加输入数据的维度) 4.tf.tile(在某个维度上按照倍数进行平铺迭代) 5.tf.squeeze(去除维度上为1的维度)
1. rnn.BasicLSTMCell(num_hidden) # 构造单层的lstm网络结构 参数说明:num_hidden表示隐藏层的个数 2.tf.nn.dynamic_rnn(cell, ...
- Kettle安装Kafka Consumer和Kafka Producer插件
1.从github上下载kettle的kafka插件,地址如下 Kafka Consumer地址: https://github.com/RuckusWirelessIL/pentaho-kafka- ...
- mysql 索引type介绍
以下全部详细解析explain各个属性含义: 各属性含义: id: 查询的序列号 select_type: 查询的类型,主要是区别普通查询和联合查询.子查询之类的复杂查询 SIMPLE:查 ...
- @RestController 与 @Controller @RequestMapping("/") 区别很大
后者可以通过返回字符串,返回到指定路径的html http://localhost:8080/ 这样显示 ,但是仍以get方式请求的. https://www.cnblogs.com/zgqys19 ...
- Java方法区(Method Area)
方法区与Java堆一样,是各个线程共享的内存区域,他在与存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有一个别 ...
- [leetcode]32. Longest Valid Parentheses最长合法括号子串
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- CentOS7 使用ifconfig命令 ENS33没有IP地址的解决办法
最近在研究和学习Linux操作系统,我并没有安装独立的Linux操作系统,我选择在虚拟机上安装Linux操作系统.我选择的虚拟机的版本是VMware Workstation Pro14,然后在虚拟机上 ...
- android 设置LOGO和app名称
mipmap和drawable目录都可以存放图片,一般情况下,将LOGO文件存放在mipmap目录,普通图片放到drawable目录. 一.在mipmap目录添加LOGO图片 在mipmap目录右键- ...
- 探索未知种族之osg类生物---呼吸分解之更新循环三
补充 当然细心的你会发现,_scene->updateSceneGraph(*_updateVisitor)中还有一个imagePager::UpdateSceneGraph()还没有进行讲解, ...
- Could not transfer artifact org.springframework
无法从中心仓库获取该版本的信息, 从新下载: 1.配置eclipse中的maven user setting路径为本地maven安装路径 配置阿里云镜像路径 <mirror> <i ...