Go ahead,someone is waiting for you in the future.
<script>
元素
使用<script>
元素可以把JavaScript插入到HTML页面中,或包含外部的JavaScript文件。
1.<script>
元素的基本属性
HTML4.01为<script>
元素定义了5个属性:
- charset:可选,表示通过src属性指定的代码的字符集,但大多数浏览器会忽略它的值。
- defer:可选,表示脚本可以延迟到文档完全被解析和显示后再执行,只对外部脚本文件有效,IE7及更早版本可以对嵌入脚本使用。
- language:已废弃,原来用于表示编写代码使用的脚本语言,大多数浏览器会忽视这个属性。
- src:可选,表示要执行代码的外部文件。
- type:可选,可以看成是language的替代属性,也可称为MIME类型(多用途互联网邮件扩展类型)。
虽然text/javascript和text/ecmascript都已经不被推荐使用,但人们一直使用的都还是text/javascript。
虽然服务器在实际传送JavaScript文件时使用的MIME类型通常是application/x-javascript,但是将type属性设置为application/x-javascript却可能导致脚本被忽略。
另外,在非IE浏览器中还可使用以下值作为type的值:application/javascript和application/ecmascript。 考虑到约定俗成和兼容性,目前type属性的默认值依旧还是text/javascript。
勘误:在《JavaScript高级程序设计第3版》的第二章中写到:
HTML4.01为
<script>
元素定义了下列6个属性:
- async:可选,表示应该立即下载该脚本,但不应该妨碍页面中的其他操作,只对外部脚本文件有效。
- charset:可选,。。。
此处async属性是HTML5新增的,而非HTML4.01定义的。
2.使用<script>
元素的方式
使用<script>
元素的方式有两种:直接在页面嵌入JavaScript代码,和包含外部JavaScript文件。
包含<script>
元素内部的JavaScript代码将被从上至下依次解释,只有解析完前面的一个<script>
元素中的代码后,才会开始解析下一个。
在解释器对<script>
元素(不使用defer和async属性)内部的所有代码求值完毕以前,页面中的其余内容都不会被浏览器加载或显示。
使用<script>
标签嵌入JavaScript代码时,避免在代码中间出现</script>
字符串从而导致脚本提前结束,必要时可以通过转义字符</script>
来解决这个问题。
在XHTML文档中,可以将<script></script>
标签简写为<script />
,但不能在HTML文档中使用这种语法。
在包含外部JavaScript文件的<script>
元素,即带有src属性的<script>
元素中,不应该在其<script>
和</script>
标签之间包含额外的JavaScript代码,因为这些额外代码会被忽略。
3.<script>
元素的位置
交互性优先的网页一般会把<script>
标签放在<head>
标签里面,强调用户体验而交互性稍后的网页一般会把<script>
标签放在<body>
标签底部。
把<script>
标签放在<head>
标签里面,意味着必须等到全部JavaScript代码和其他代码(<head>
元素中可能还包含CSS文件)都解析执行完毕,才能开始呈现网页内容(浏览器解析<body>
标签时才开始呈现内容),在这段延迟期页面都是一片空白,因此目前流行的做法,是把全部JavaScript引用放在<body>
元素中页面内容的后面,即页面底部。
4.延迟执行脚本
<script type="text/javascript" defer="defer" src="example.js"></script>
HTML4.0.1(IE6也支持)为<script>
标签定义了defer属性,这个属性的用途是表明脚本在执行时不会影响页面的构造,也就是说浏览器会立即下载脚本,但延迟到整个页面都解析完(即解析到</html>
标签)才执行。
虽然HTML5规范要求脚本按照它们出现的先后顺序执行,且延迟脚本会先于DOMContentLoaded事件执行,但是实际情况中,延迟脚本并不一定按顺序执行,也不一定在DOMContentLoaded事件触发前执行,所以最好只包含一个延迟脚本。
HTML5中已明确规定,defer属性只适用于外部脚本文件,支持HTML5的浏览器会忽略嵌入脚本的defer属性(IE4-IE7仍支持嵌入脚本的defer属性,IE8+则完全支持HTML5的规定)。
IE4、Firefox 3.5、Safari 5和Chrome是最早支持defer属性的浏览器,其他浏览器会忽略这个属性,周全起见,把延迟执行脚本放在页面底部依然是最佳选择。
5.异步脚本
<script type="text/javascript" async src="example.js"></script>
HTML5为<script>
标签定义了async属性。与defer属性类似,async只适用于外部脚本文件,它会告诉浏览器立即下载脚本。与defer不同的是,标记为async的脚本下载完会立即执行。
异步脚本同样不保证按照指定的顺序先后执行,因此这些脚本之间应互不依赖。
添加异步脚本的目的,是为了不让页面等待脚本下载和执行,从而异步加载页面其他内容,因此最好不要在异步脚本中修改DOM。
异步脚本一定会在load事件前执行,但可能会在DOMContentLoaded事件之前或之后执行。
在XHTML文档中,要把async属性设置为async="async"。
支持异步脚本的浏览器:Firefox 3.6、Safari 5和Chrome。
6.不推荐使用的语法
早期,不支持JavaScript的浏览器(如Mosaic)会把<script>
元素内的内容直接输出到页面,当时的解决方案是将JavaScript代码包含在一个HTML注释中,如下:
如此,不支持JavaScript的浏览器会忽略<script>
标签中的内容,而支持的则必须进一步确认是否包含需要解析的JavaScript代码。由于目前所有浏览器都已支持JavaScript,因此不再推荐这种语法。
在XHTML模式下,脚本会因包含在XML注释中而被忽略。
嵌入代码与外部文件
在HTML中嵌入JavaScript代码虽然没有问题,但一般的做法是尽可能使用外部文件来包含JavaScript代码,这里并没有硬性规定必须要使用外部文件,但是这样做有诸多优点:
- 可维护性:在不触及HTML代码的情况下集中精力编辑JavaScript。
- 可缓存:如果有多个页面使用同一个文件,那这个文件只需下载一次。
- 适应未来:HTML和XHTML包含外部文件的语法是相同的,从而规避了一些问题。
文档模式
IE5.5引入了文档模式的概念,它通过使用文档类型切换来实现。最初的两种文档模式是:混杂模式和标准模式,后又加入一个准标准模式。
如果在文档开始处没有文档类型说明,则浏览器默认开启混杂模式(不同浏览器在此模式下差异巨大)。
标准模式开启可以使用多种文档类型:
- HTML 4.01 严格型
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- XHTML 1.0 严格型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- HTML 5
<!DOCTYPE html>
准标准模式可以使用过渡型或框架集型文档类型来触发:
- HTML 4.01 过渡型
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- HTML 4.01 框架集型
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
- XHTML 1.0 过渡型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transtional.dtd">
- XHTML 1.0 框架集型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
因为准标准模式与标准模式差异很小,所以标准模式通常指的是两者之中任意一种。
<noscript>
元素
早期,不支持JavaScript的浏览器都面临着一个问题,如何让页面平稳的退化为普通页面。最终的解决方案是创造一个<noscript>
元素,用来在不支持JavaScript的浏览器中显示替代内容。这个元素可以包含能出现在<body>
中的任何HTML元素---除了<script>
。
当且仅当符合以下任意一个条件,浏览器都会显示<noscript>
的内容:
- 浏览器不支持脚本;
- 浏览器支持脚本,但脚本被禁用。