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