1.1<script>标签
<script>标签有6个属性:
- async:可选。表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本文件有效。
- charset:可选。表示通过src属性指定的代码的字符集。由于大多数浏览器会忽略他的值,因此这个属性很少用。
- defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。
- language:已废弃。
- src:可选。表示包含要执行代码的外部文件。
- type:可选。可以看成是language的替代属性,默认是text/javascript。
使用<script>元素的方式有两种:直接在页面中嵌入JavaScript代码和包含外部JavaScript文件。
在使用<script>元素嵌入JavaScript代码时,只须为<script>指定type属性。然后,像下面这样把JavaScript代码直接放在元素内部即可:
1 <script type="text/javascript"> 2 function sayHi(){ 3 alert("hi"); 4 } 5 </script>
注意:不要在代码中的任何地方出现"</script>"字符串,如 alert("</script>"),对于这种情况需要使用转义字符 alert("<\/script>")
如果要通过<script>元素来包含外部JavaScript文件,就需要用到src属性,例如:
<script type="text/javascript" src="example.js"></script>
<script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>
外部文件只须包含通常要放在开始的<script>和结束的</script>之间的那些JavaScript代码即可。与解析嵌入式JavaScript代码一样,在解析外部JavaScript文件(包括下载该文件)时,页面的处理也会暂时停止。
1.2 标签的位置
按照传统的做法,所有的<script>元素都应该放在页面的<head>元素中。这种做法的目的是把所有外部文件(包括CSS文件和JavaScript文件)的引用都放在相同的地方。可是,在文档的<head>元素中包含所有JavaScript文件,意味着必须等到全部JavaScript代码都被下载、解析和执行完成以后,才能开始呈现页面的内容(浏览器在遇到<body>标签时才开始呈现内容)。对于那些需要很多JavaScript代码的页面,这样做会导致浏览器在呈现页面时出现明显的延迟,而延迟期间的浏览器窗口将是一片空白。
为了避免这个问题,一般将JavaScript放在<body>元素结束之前就行
1.3 延迟脚本
defer属性表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。
<script type="text/javascript" defer="defer" src="example.js"></script>
即使脚本放在了<head>元素中,如果声明defer后,仍会在</html>标签之后再执行。
defer属性只适用于外部脚本文件。因此支持HTML5的实现会忽略给嵌入脚本设置的defer属性。将延迟脚本放在页面底部仍然是最佳选择。
1.4 异步脚本
HTML5为<script>元素定义了async属性。这个属性与defer属性相似,都用于改变处理脚本的行为。与defer相似,async只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer不同的是,标记为async的脚本并不保证按照指定他们的先后顺序执行,因此确保两个异步的脚本的互不依赖很重要。
指定async属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。为此,建议异步脚本不要在加载期间修改DOM。
异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行。