文章为《JavaScript高级程序设计》(第三版)笔记。
本节内容
- <script>的6个属性
- <script>标签的位置
- 延迟脚本-defer
- 异步脚本-async
- 嵌入代码与外部文件
- 文档模式
1.HTML5为<script>定义了6个属性
- async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或脚本。只对外部脚本文件有效。
- charset:可选。表示通过src属性指定的代码的字符集。
- defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本有效。IE7及更早版本支持这个属性。
- language:已废弃。
- src:可选。表示包含要执行代码的外部文件。不过,在访问自己不能控制的服务器上的JavaScript文件时则要多加小心,除非那个域的所有者值得信赖。
- type:必选。表示编写代码使用的脚本语言的内容类型。这个属性并不是必须的,如果没有这个属性,则其默认值仍为text/javascript。
2.<script>标签的位置
<!DOCTYPE html>
<html>
<head>
<title>标题</title>
<script src="example.js" async></script>
</head>
<body>
<!-- 页面内容 -->
</body>
</html>
第一种情况,<script>标签放在<head>之中,然后结合实际情况考虑是否加 async 或 defer 属性;第二种情况,现代Web应用程序一般都会把全部JavaScript引用放在<body>元素中页面内容的后面,如下:
<!DOCTYPE html>
<html>
<head>
<title>标题</title>
</head>
<body>
<!-- 页面内容 -->
<script src="example.js"></script>
</body>
</html>
3.延迟脚本-defer
在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但脚本延迟到整个页面都解析完成后再执行。
<script src="example1.js" defer></script>
<script src="example2.js" defer></script>
在现实当中,多个延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本。
IE4、Firefox3.5、Safari5和Chrome是最早支持defer属性的浏览器。其他浏览器会忽略这个属性,像平常脚本一样处理。因此,把延迟脚本放在页面底部仍然是最佳选择。
4.异步脚本-async
和defer类似,但不同的是,标记为async的脚本并不保证按照指定它们的先后顺序执行。‘
<script src="example1.js" async></script>
<script src="example2.js" async></script>
这里的第二个脚本可能会在第一个脚本之前执行。使用async属性的目的是不让页面等待两个脚本的下载和执行,从而加载页面其他内容,为此,建议异步脚本不要在加载期间修改DOM。
异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。
在XHTML文档中,defer要设置为defer="defer",async要设置为async="async"。
5.嵌入代码与外部文件
在没使用defer和async属性时,页面从上到下依次执行,在加载和执行JavaScript代码时,页面中的其余内容都不会被浏览器加载或显示。
一般情况下,建议尽可能使用外部文件的形式来包含JavaScript代码,其优点如下:
- 可维护性
- 可缓存:浏览器能够根据具体的设置缓存链接的所有外部JavaScript文件。如果有两个页面都使用同一个文件,那么这个文件只需下载一次。
- 适应未来
6.文档模式
IE5.5引入了文档模式的概念,而这个概念是通过使用文档类型(doctype)切换来实现的。最初的文档模式是:混杂模式和标准模式。混杂模式会让IE的行为与(含非标准特性的)IE5相同,而标准模式则让IE的行为更接近标准行为。后来IE又提出准标准模式,由于和标准模式差异不大,所以标准模式一般指除混杂模式之外的其他模式。