<script> 按照出现顺序被执行
- 后加载的脚本可以依赖先加载的脚本, 但是先加载的脚本堵塞, 整个网页的加载会堵塞.
- 当一个脚本被执行时, 可以访问前面的 HTML 元素, 但不能访问后面的元素.
- 页面元素在他之前的所有脚本都加载完之前是不会执行渲染的.
async
和 defer
HTML5 添加了两个工具用于控制脚本的执行
async
表示”不用马上执行”. 定义一个页面需要的变量或函数在async
中是不行的, 因为你没法知道什么时候async
代码会执行defer
表示”等待页面解析完成之后执行”, 大致等价于把脚本绑定到window.onload
事件. 当这个代码被执行, DOM 中的一切元素都可以访问, 不同于async
, 所有加了defer
的脚本会按照他们出现在 HTML 中的顺序执行, 只是推迟到页面解析后按顺序执行.
type 属性
设定解释器
若要修改 type 的默认属性(默认为 javascript), 可以通过一个标记实现:<meta http-equiv = "Content-Script-Type" content = "text/vbscript"
integrity 属性
integrity
属性是子资源完整性新规范的一部分, 他允许你为脚本文件将包含的内容提供一个 hash, 这意味着可以防止在传输的时候内容丢失或被恶意修改. 就算使用了 SSL, 这个规范也是有意义的, 因为有时候你要加载的资源是你无法控制的站外资源.
如果你选择使用他, 就要在<script>标记里添加一个 hash 类型以及 hash 值, 将他们以连字符分隔<script src="..." integrity = "hash-value"></script>
document.currentScript
IE 不支持的一个新东西叫 document.currentScript
, 他指向当前正在执行的脚本, 如果你要从你嵌入的<script>中拿一些属性用
<script>和 innerHTML
通过 DOM 动态添加到页面上的 <script> 会被浏览器执行
var myScript = document.createElement("script");
myScript.textContent = "alert('hello')";
document.head.appendChild(myScript);
然而, 通过innerHTML
动态添加到到 HTML 的 <script> 则不会被执行document.head.innerHTML += "<script>alert('Hello')</script>"
Note: 但是他会显示在 HTML 里(尽管不会执行)