async與defer

<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>元素  只有在瀏覽器不支持腳本,或者支持腳本但被禁用時顯示;

相關文章
相關標籤/搜索