<script>元素的幾種常見屬性: async 非同步載入,立即下載,不應妨礙頁面其他操作,標記為 async 的非同步腳本並不保證按照指定的先後順序執行,因此非同步腳本不應該在載入期間修改DOM,非同步腳本一定會在頁面的 load 事件前執行,不一定在 DOMContentLoaded 事件前後觸發,j ...
<script>元素的幾種常見屬性:
async 非同步載入,立即下載,不應妨礙頁面其他操作,標記為 async 的非同步腳本並不保證按照指定的先後順序執行,因此非同步腳本不應該在載入期間修改DOM,非同步腳本一定會在頁面的 load 事件前執行,不一定在 DOMContentLoaded 事件前後觸發,js有依賴性時,用async很容易出錯,async 是無序執行,自身載入完就會執行;
DOMContentLoaded 事件於window的onload事件不同:
onload事件是UI事件,是window對象的onload,當頁面完全載入後(包括所有的圖片、JS文件、CSS文件等外部資源),就會觸發window的onload事件
DOMContentLoaded事件是HTML5事件,本來是document對象的事件,會冒泡到window對象,形成了完整DOM樹之後就會觸發(不理會圖片、JS文件、CSS文件或其它資源是否已經下載完畢)
defer 延遲腳本,非同步載入,立即下載,但腳本會延遲到整個頁面都解析完畢後再運行,HTML5規範要求按照出現的前後順序執行,並且會先於 DOMContentLoaded 事件觸發前執行,現實當中 defer 腳本不一定按照順序執行,也不一定會先於DOMContentLoaded事件前執行,因此最好只包含一個延遲腳本,defer 是有序執行
async與defer區別:
相同點: 都是非同步載入,不阻塞頁面渲染;都可以只使用屬性名,不定義屬性值;都只對外部腳本適用(IE7之前針對嵌入式腳本使用defer,IE8+只支持外部腳本);
不同點: async 會在載入完成後立即執行,因此它是無序執行,但一定會在window的onload事件之前執行,DOMContentLoaded事件前後不確定;
defer 會等到整個頁面解析完後再執行,一般會按照順序執行,會先於DOMContentLoaded事件觸發前執行;
JS載入執行順序:
如果沒有async和defer屬性,那麼瀏覽器會立即執行當前JS腳本阻塞後面的腳本;
如果有async屬性,那麼瀏覽器載入它會與載入其它資源並行進行,非同步載入,它自身載入完畢後立馬執行;
如果有defer屬性,那麼瀏覽器載入它也會與其它資源並行進行,非同步載入,該腳本會被延遲到整個頁面全部解析完畢後再執行;
DOMContentLoaded先於onload事件觸發;
type 可以看做為language(已經棄用)的替代屬性,該腳本語言的MIME類型,預設為text/javascript;
src 要執行代碼的外部文件;
<noscript>元素 只有在瀏覽器不支持腳本,或者支持腳本但被禁用時顯示;