<script>元素,js编写方式,script标签位置,执行js脚本的顺序,编写JavaScript注意事项,<noscript>元素
1. <script>元素
将JavaScript插入HTML的主要方法是使用 <script>元素
<script>元素由网景公司创造,后来正式被加入到HTML规范
<script>元素有8个属性
1.1. async
- 告诉浏览器立即下载脚本,但不保证脚本的次序执行
- 告诉浏览器不必等脚本下载和执行完后再加载页面,同样不必等到异步脚本下载和执行后再加载其他脚本
- 只对外部脚本文件有效
1.2. defer
- 告诉浏览器立即下载脚本
- 但是脚本会被延迟到整个页面都解析完毕后运行
- 只对外部脚本文件有效
1.3. charset
- 使用src属性指定代码字符集
1.4. crossorigin
- 配置相关请求的跨资源共享设置
- crossorigin = “anonymous” 配置文件请求不必设置凭据标志
- crossorigin = “use-credentials” 设置凭据标志
1.5. interity
- 比对接收到的资源和指定的加密签名以验证子资源完整性
- 如果不匹配,页面会报错,脚本不会执行
1.6. language
- 废弃
- 最初用于表示代码块中的脚本语言(JavaScript,JavaScript1.2,VBScript等)
1.7. src
- 指定外部文件地址
1.8. type
- 代替language,表示代码块中脚本语言的内容类型(MIME类型)
- 值可以为
- text/javascript:废弃
- text/ecmascript:废弃
- application/x-javascript
- appplication/javascript
- application/ecmascript
- module:作为es6模块,匹配代码中的import/export关键字
2. JavaScript的编写方式
2.1. 行内式-HTML代码行内
1 | <body> |
2.2. 内嵌式-script标签中
- 嵌入行内JavaScript代码,直接把代码放在<script>元素中
- 包含在script标签内的代码会被从上到下解释
1 | <body> |
要注意行内代码中不能出现字符串</script>,浏览器解析行内脚本时看到字符串</script>就会当作script的结束标签。为了避免这个问题,需要使用转义字符
\1
2
3
4
5
6<script>
// Unterminated string literal.
console.log("</script>");
console.log("<\/script>");
</script>
2.3. 外联式-外部的script文件
需要通过src属性来引入JavaScript文件
1
2
3
4<body>
<input type="button" value="点击一下">
<script src="index.js"></script>
</body>Index.js
1
2
3
4const button = document.querySelector("input");
button.onclick = function(){
alert('Hello World');
}使用了src属性的script元素不能在<script></script>标签中再包含其他代码。如果两者存在浏览器只会下载并执行脚本文件,
忽略行内代码1
2
3
4
5
6<body>
<input type="button" value="点击一下">
<script src="index.js">
console.log("<\/script>");
</script>
</body>src属性值可以是一个完整的,和HTML页面不在同一个域的URL
1
<script src="https://r.bing.com/rs/7b/xb/nj/jQ1w07qyCcc9l2abcuV-aLzD-d8.js"></script>
- 浏览器在解析这个资源时会向src属性指定的路径发送一个GET请求,取回相应资源
- 这个请求不受浏览器同源策略限制但受父页面HTTP/HTTPS协议限制,而返回被执行的JavaScript受浏览器同源策略限制
浏览器会根据特定的设置缓存所有外部链接的JavaScript文件。对于不同页面引用同一个JavaScript文件时,该js文件只需被下载一次,加快页面记载速度
3. script标签位置
所有<script>元素都被放在页面的<head>标签内
1
2
3
4
5
6
7
8
9<html>
<head>
<script src="a.js"></script>
<script src="b.js"></script>
</head>
<body>
<!-- 页面内容 -->
</body>
</html>- 是为了把外部的CSS和JavaScript文件都集中放在一起,但也意味着必须等JavaScript代码都下载,解析和解释完才能开始渲染页面
- 页面在浏览器解析到<body>起始标签时才开始渲染
- 这会导致页面渲染的明显延迟,使得在此期间浏览器窗口完全空白
将所有JavaScript引用放在<body>元素中页面内容最后
1
2
3
4
5
6
7
8
9<html>
<head>
<!-- ... -->
</head>
<body>
<script src="a.js"></script>
<script src="b.js"></script>
</body>
</html>- 页面会在处理JavaScript代码之前完全渲染页面
4. 执行JavaScript脚本
4.1. 顺序执行脚本
浏览器会按照<script>在页面中出现的顺序依次解释脚本
必须等到上一个脚本解释完才能开始下一个
4.2. 推迟执行脚本
- <script>元素中的defer属性表示告诉浏览器应该立即开始下载脚本,但执行推迟
- 使得脚本在执行时不会改变页面结构
- 因此脚本完全可以在整个页面解析完之后运行
a.js
1 | console.log("js-a"); |
b.js
1 | console.log("js-b"); |
完整html
1 | <html> |
输出结果
1 | js-html |
- 上述代码中<script>元素包含在页面的<head>中,但是会在浏览器解析到html结束标签后才执行
- HTML5规范脚本按照出现顺序执行,因此第一个推迟的脚本执行后才会执行第二个,依次执行
- 但是推迟的脚本都会在DOMContentLoaded事件之前执行完
4.3. 异步执行脚本
- <script>元素中的async属性表示告诉浏览器不必等脚本下载和执行完再加载页面,同样不必等异步脚本下载和执行后在下载其他脚本
- 从改变脚本处理方式上看,defer和async属性类。但是不同于defer属性的是,async不保证多个外部脚本执行顺序
- 异步脚本会在页面的load事件前执行,可能在DOMContentLoaded事件之前或之后
1 | <html> |
执行结果
1 | js-html |
5. JavaScript编写的注意事项
5.1. script元素不能写成单标签
- 在外联式引用js文件时,script标签中不可以写JavaScript代码,并且script标签不能写成单标签
- 即不能写成 <script src=”index.js”/>
5.2. 省略type属性
- 在以前的代码中,script标签中会使用
type=“text/javascript” - 现在可不写这个代码了,因为JavaScript 是所有现代浏览器以及 HTML5 中的默认脚本语言
5.3. 加载顺序
- 作为HTML文档内容的一部分,JavaScript默认遵循HTML文档的加载顺序,即
自上而下的加载顺序 - 推荐将JavaScript代码和编写位置放在body子元素的最后一行
5.4. 严格区分大小写
- HTML元素和CSS属性不区分大小写,但是在JavaScript中严格区分大小写
6. noscript元素
针对早期浏览器不支持 JavaScript 的问题,noscript元素被用于给不支持 JavaScript 的浏览器提供替代内容
1
2
3
4
5<body>
<noscript>
<p>您的浏览器不支持或者关闭原型JavaScript</p>
</noscript>
</body>下面的情况下, 浏览器将显示包含在noscript中的内容
浏览器不支持脚本
浏览器对脚本的支持被关闭
