第二章 在HTML中使用Javascript --《Javascript高级程序设计》
一、<script>元素
向HTML 页面中插入JavaScript 的主要方法,就是使用<script>元素。
HTML 4.01 为<script>定义了下列6 个属性。
(1)async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本文件有效。
async [əˈsɪŋk] 异步 非同步
(2) charset:可选。表示通过src 属性指定的代码的字符集。由于大多数浏览器会忽略它的值,因此这个属性很少有人用。
charset n. 字符集;字元集
(3)defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。IE7 及更早版本对嵌入脚本也支持这个属性。
defer [dɪ'fɜː] vi. 推迟;延期;服从 vt. 使推迟;使延期
(4) language:已废弃。原来用于表示编写代码使用的脚本语言(如JavaScript、JavaScript1.2或VBScript)。大多数浏览器会忽略这个属性,因此也没有必要再用了。
(5)src:可选。表示包含要执行代码的外部文件。
(6)type:可选。可以看成是language 的替代属性;表示编写代码使用的脚本语言的内容类型(也称为MIME 类型)。虽然text/javascript 和text/ecmascript 都已经不被推荐使用,但人们一直以来使用的都还是text/javascript。实际上,服务器在传送JavaScript 文件时使用的MIME 类型通常是application/x–javascript,但在type 中设置这个值却可能导致脚本被忽略。另外,在非IE浏览器中还可以使用以下值:application/javascript 和application/ecmascript。考虑到约定俗成和最大限度的浏览器兼容性,目前type 属性的值依旧还是text/javascript。不过,这个属性并不是必需的,如果没有指定这个属性,则其默认值仍为text/javascript。
使用<script>元素的方式有两种:直接在页面中嵌入JavaScript 代码和包含外部JavaScript文件。
在使用<script>元素嵌入JavaScript 代码时,只须为<script>指定type 属性。然后,像下面这样把JavaScript 代码直接放在元素内部即可:
<script type="text/javascript">
function sayHi(){
alert("Hi!");
}
</script>
包含在<script>元素内部的JavaScript 代码将被从上至下依次解释。就拿前面这个例子来说,解释器会解释一个函数的定义,然后将该定义保存在自己的环境当中。在解释器对<script>元素内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示。
如果要通过<script>元素来包含外部JavaScript 文件,那么src 属性就是必需的。这个属性的值是一个指向外部JavaScript 文件的链接,例如:
<script type="text/javascript" src="example.js"></script>
在这个例子中,外部文件example.js 将被加载到当前页面中。外部文件只须包含通常要放在开始的<script>和结束的</script>之间的那些JavaScript 代码即可。与解析嵌入式JavaScript 代码一样,在解析外部JavaScript 文件(包括下载该文件)时,页面的处理也会暂时停止。
在文档的<head>元素中包含所有JavaScript 文件,意味着必须等到全部JavaScript 代码都被下载、解析和执行完成以后,才能开始呈现页面的内容(浏览器在遇到<body>标签时才开始呈现内容)。对于那些需要很多JavaScript 代码的页面来说,这无疑会导致浏览器在呈现页面时出现明显的延迟,而延迟期间的浏览器窗口中将是一片空白。为了避免这个问题,现代Web 应用程序一般都把全部JavaScript 引用放在<body>元素中页面内容的后面。
<!DOCTYPE html>
<html>
<head>
<title>Example HTML Page</title>
</head>
<body>
<!-- 这里放内容 -->
<script type="text/javascript" src="example1.js"></script>
<script type="text/javascript" src="example2.js"></script>
</body>
</html>
1、延迟脚本
<script>标签的defer 属性。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在<script>元素中设置defer 属性,相当于告诉浏览器立即下载,但延迟执行。
<script type="text/javascript" defer="defer" src="example1.js"></script>
defer 属性只适用于外部脚本文件。
HTML5 规范要求脚本按照它们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行。
在现实当中,延迟脚本并不一定会按照顺序执行。
2、异步脚本
HTML5 为<script>元素定义了async 属性。这个属性与defer 属性类似,都用于改变处理脚本的行为。同样与defer 类似,async 只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer不同的是,标记为async 的脚本并不保证按照指定它们的先后顺序执行。
<script type="text/javascript" async src="example1.js"></script>
<script type="text/javascript" async src="example2.js"></script>
第二个脚本文件可能会在第一个脚本文件之前执行。
指定async 属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。为此,建议异步脚本不要在加载期间修改DOM。
3、在XHTML中的用法
可扩展超文本标记语言,即XHTML(Extensible HyperText Markup Language),是将HTML 作为XML 的应用而重新定义的一个标准。
编写XHTML 代码的规则要比编写HTML 严格得多,而且直接影响能否在嵌入JavaScript 代码时使用<script/>标签。