脚本标签
脚本标签
脚本的执行顺序
默认执行顺序
下面的代码很直观地说明了这一点:
<script>
var x = 3;
</script>
<script>
alert(x);
// Will alert "3";
</script>
使用外链资源时加载次序没有那么直观,但依然是成立的:
<script src="//typekit.com/fj3j1j2.js"></script>
<!-- This second script won’t execute until typekit has executed, or timed out -->
<script src="//my.site/script.js"></script>
如果你混合使用外链和内联的document.appendChild
之类的方法添加
<html>
<head>
<script>
// document.head is available
// document.body is not!
</script>
</head>
<body>
<script>
// document.head is available
// document.body is available
</script>
</body>
</html>
你可以想象querySelectorALl
,document.head
在任何写在网页上的document.body
只有当你将
async 和defer
-
async
表示“不用马上执行它”。更具体地它表示:我不介意你在整个网页加载完成之后执行这个脚本,把它放在其他脚本执行之后。这对于统计分析脚本来说非常有用,因为页面上没有其他的代码需要依赖于统计脚本执行。定义一个页面需要的变量或函数在async
的代码中是不行的,因为你没有方法知道什么时候async
代码将会被实际执行。 -
defer
表示“等待页面解析完成之后执行”。它大致等价于将你的脚本绑定到DOMContentedLoaded
事件,或者使用jQuery.ready
。当这个代码被执行,DOM 中的一切元素都可用。不同于async
,所有加了defer
的脚本将会按照它们出现在HTML 页面中的顺序执行,它只是推迟到HTML 页面解析完毕后开始执行。
type: 自定义脚本类型
从历史上看type=text/javascript
没有什么关系。如果你通过 type
设置一个非
<script type="text/emerald">
make a social network
but for cats
</script>
这段代码实际执行结果由你自己决定,例如:
<script>
var codez = document.querySelectorAll("script[type="text/emerald"]");
for (var i=0; i < codez.length; i++)
runEmeraldCode(codez[i].innerHTML);
</script>
定义 runEmeraldCode
函数留给你们作为练习。如果你有特别的需要,你也可以重写页面上type
,方法是通过一个 meta
标签
<meta http-equiv="Content-Script-Type" content="text/vbscript" />
或者一个请求返回一个Content-Script-Type
type
用法的更详细信息。
integrity
integrity
属性是子资源完整性新规范的一部分。它允许你为脚本文件将包含的内容内容提供一个code.jquery.com
。如果你选择使用它,你要在
<script
src="//code.jquery.com/jquery.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
></script>
我还没有看到有人用了它,然而如果你知道有哪个网站用了,可以在下面评论。