1、使用”script”元素
2.1 <script>
元素
向HTML页面中插入JavaScript的主要方法,就是使用”<script>
“元素。
“<script>
”有以下六个属性:
- async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本有效。
- charset:可选。表示通过src属性指定的代码的字符集。
- defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。
- language:已废弃。原来用于表示编写代码使用的脚本语言。
- src:表示包含要执行代码的外部文件。
- type:可选。可以看做是language的替代属性。表示编写代码使用的脚本语言的内容类型。目前type这个属性的值依旧还是text/JavaScript。不过这个属性并不是必须的。
使用“<script>
”元素的方式有两种:直接在页面中嵌入JavaScript代码和包含外部JavaScript文件。
在使用”<script>
“元素嵌入JavaScript代码时,只需为“<script>
”指定type属性。然后像这样把JavaScript代码直接放进元素内部即可:
<script type="text/javascript">
function sayHi(){
alert("Hi");
}
</script>
遇到字符串“</script>
”,把字符串分隔为两部分。例如:
<script type="text/javascript">
function sayScript(){
alert("<\/script>");
}
</script>
如果是通过“<script>
”来包含外部JavaScript文件,则src属性为必需的。
例如:
<script type="text/javajscript" src="example.js"></script>
需要注意的是:带有src属性的”<script>
“元素不应该在其<script>和</script>
标签之间再包含额外的JavaScript代码。如果包含了嵌入的代码,则只会下载并执行外部脚本文件,嵌入的代码会被忽略。
src还可以包含外部域的JavaScript文件。
例如:
<script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>
只要不存在defer和async属性,浏览器都会按照<script>
元素在页面中出现的先后顺序对它们依次解析。
2.1.1 标签的位置
为了避免“等到全部的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>
这样在解析包含JavaScript的代码之前,页面的内容将完全呈现在浏览器中。
2.1.2 延迟脚本
defer属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕再运行。因此在<script>
元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。
<!DOCTYPE HTML>
<html>
<head>
<title>Example HTML Page</title>
</head>
<body>
<!-- 这里放内容-->
<script type="text/javascript" src="example1.js" defer="defer"></script>
<script type="text/javascript" src="example2.js" defer="defer"></script>
</body>
</html>
这个例子中,<script>
元素将延迟到浏览器遇到</html>
标签之后再执行。
HTML5规范要求脚本按照它们出现的先后顺序执行,第一个延迟脚本会先于第二个延迟脚本。而这个两个脚本会先于DOMContentLoaded事件执行。但在现实中,延迟脚本并不一定会按照顺序执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包括一个延迟脚本。
2.1.3 异步脚本
async属性与defer属性类似,都用于改变处理脚本的行为,只适用于外部脚本文件,并告诉浏览器你立即下载文件。但与defer不同的是标记为async属性的脚本并不保证按照指定它们的先后顺序执行。
例如:
<!DOCTYPE HTML>
<html>
<head>
<title>Example HTML Page</title>
</head>
<body>
<!-- 这里放内容-->
<script type="text/javascript" src="example1.js" async></script>
<script type="text/javascript" src="example2.js" async></script>
</body>
</html>
在以上代码中,第二个脚本问加你可能会在第一个脚本文件之前执行。因此确保两者之间互不依赖非常重要。
指定async属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。为此,建议异步脚本不要在加载期间修改DOM。
异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。
小结:
- 在包含外部JavaScript文件时,必须将src属性设置为指向相应文件的URL。而这个文件既可以是与包含它的页面位于同一个服务器上的文件,也可以是其他任何域中的文件。
- 所有
<script>
元素都会按照它们在页面中出现的先后顺序被依次解析。在不使用defer和async属性的情况下,只有在解析完前面的<script>
元素中的代码之后,才会开始解析后面<script>
元素中的代码。 - 由于浏览器会先解析完不使用defer属性的
<script>
元素中的代码,然后再解析后面的内容,所以一般应该把<script>
元素放在页面最后,即主要内容后面,</body>
标签前面。 - 使用defer属性可以让脚本在文档完全呈现之后再执行。延迟脚本总是按照指定它们的顺序执行。
- 使用async属性可以让当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。
另外,使用<noscript>
元素可以指定在不支持脚本的浏览器中显示的替代内容。但在启用了脚本的情况下,浏览器不会显示<noscript>
元素中的任何内容。