概述
HTML <script>
元素的作用是在HTML或XHTML文档中嵌入或引用可执行的脚本。没有async或
defer属性的脚本和内联脚本会在浏览器继续解析剩余文档前被获取并立刻执行
。
- 内容分类 Metadata content, Flow content, Phrasing content.
- 可用内容
动态脚本,如text/javascript
. - Tag omission 不允许,开始标签和结束标签都不能省略。
- 可用父元素 Any element that accepts metadata content, or any element that accepts phrasing content.
- DOM接口
HTMLScriptElement
属性
该元素包含全局属性。
async
HTML5- 该布尔属性指示浏览器是否在允许的情况下异步执行该脚本。该属性对于内联脚本无作用 (即没有src属性的脚本)。
- 关于浏览器支持请参见浏览器兼容性。另可参见文章asm.js的异步脚本.
src
- 这个属性定义引用外部脚本的URI,这可以用来代替直接在文档中嵌入脚本。有src属性的
script元素标签内不应该再有嵌入的脚本
type
- 该属性定义script元素包含或
src
引用的脚本语言。属性的值为MIME类型; 支持的MIME类型包括text/javascript
,text/ecmascript
,application/javascript
, 和application/ecmascript
。如果没有定义这个属性,脚本会被视作JavaScript。 - 如果MIME类型不是JavaScript类型(上述支持的类型),则该元素所包含的内容会被当作数据块而不会被浏览器执行。
- 如果type属性为
module
,代码会被当作JavaScript模块 。请参见ES6 in Depth: Modules - 在Firefox中可以通过定义type=application/javascript;version=1.8来使用如let声明这类的JS高版本中的先进特性。 但请注意这是个非标准功能,其他浏览器,特别是基于Chrome的浏览器可能会不支持。
- 关于如何引入特殊编程语言,请参见这篇文章。
language
- 和
type属性类似,这个属性定义脚本使用的语言。
但是与type不同的是,这个属性的可能值从未被标准化过。请用type
属性代替这个属性。 defer
- 这个布尔属性定义该脚本是否会延迟到文档解析完毕后才执行。但因为这个功能还未被所有主流浏览器实施,开发人员不应假设脚本实际上都会被延迟执行。
defer属性不应在没有
src属性的脚本标签上使用。从
Gecko 1.9.2开始, 没有src属性的脚本标签的defer属性
会被忽略。但是在Gecko 1.9.1中,如果定义了defer属性,即使内嵌的脚本也会被延迟执行。 crossorigin
- Normal
script
tags will pass minimal information to thewindow.onerror
for scripts which do not pass the standard CORS checks. To allow error logging for sites which use a separate domain for static media, several browsers have enabled thecrossorigin
attribute for scripts using the same definition as the standard imgcrossorigin
attribute. Efforts to standardize this attribute are underway on the WHATWG mailing list.
示例
<!-- HTML4 and (x)HTML --> <script type="text/javascript" src="javascript.js"> <!-- HTML5 --> <script src="javascript.js"></script>
规范
规范 | 状态 | 备注 |
---|---|---|
HTML5 <script> |
Recommendation | |
HTML 4.01 Specification <script> |
Recommendation |
浏览器兼容性
功能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本支持 | 1.0 | 1.0 (1.7 or earlier) | (Yes) | (Yes) | (Yes) |
async属性 | (Yes) | 3.6 (1.9.2) | 10 | 未实现 | (Yes) |
defer属性 | (Yes) | 3.5 (1.9.1) |
4 (非标准实现) 10 (标准实现) |
未实现 | (Yes) |
crossorigin 属性 | 30.0 Chromium Bug 159566 | 13 (13) bug 696301 | 未实现 | 12.50 | (Yes) |
功能 | Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|
基本支持 | (Yes) | 1.0 (1.0) | (Yes) | (Yes) | (Yes) |
async 属性 | (Yes) | 1.0 (1.0) | 未实现 | ? | (Yes) |
defer属性 | (Yes) | 1.0 (1.0) | 未实现 | ? | (Yes) |
异步支持
In older browsers that don't support the async attribute, parser-inserted scripts block the parser; script-inserted scripts execute asynchronously in IE and WebKit, but synchronously in Opera and pre-4.0 Firefox. In Firefox 4.0, the async
DOM property defaults to true
for script-created scripts, so the default behavior matches the behavior of IE and WebKit. To request script-inserted external scripts be executed in the insertion order in browsers where the document.createElement("script").async
evaluates to true
(such as Firefox 4.0), set .async=false
on the scripts you want to maintain order. Never call document.write()
from an async
script. In Gecko 1.9.2, calling document.write()
has an unpredictable effect. In Gecko 2.0, calling document.write()
from an async
script has no effect (other than printing a warning to the error console).
Gecko特别备注
Starting in Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1), inserting script elements that have been created by calling document.createElement("script") into the DOM no longer enforces execution in insertion order. This change lets Gecko properly abide by the HTML5 specification. To make script-inserted external scripts execute in their insertion order, set .async=false on them.
Also, <script>
elements inside <iframe>
, <noembed>
and <noframes>
elements are now executed, for the same reasons.