1. <del id="uvx8x"></del>

      首頁(yè)>新聞資訊>javascript按順序加載運行js方法

      javascript按順序加載運行js方法

      瀏覽器會(huì )異步加載 javascript 文件,但是會(huì )按照引用文件中的書(shū)寫(xiě)順序從上到下執行解析 javascript

      Defer屬性標記

      defer是html4.0中定義的,該屬性使得瀏覽器能延遲腳本的執行,等文檔完成解析完成后會(huì )按照他們在文檔出現順序再去下載解析。

      也就是說(shuō)defer屬性的 script 就類(lèi)似于將 script 放在body中的加載 效果一致.

      但是defer屬性在各個(gè)瀏覽器中支持程度有點(diǎn)不同,就是說(shuō),有的瀏覽器不完全支持.

      Async屬性標注

      async是HTML5新增的屬性, 大部分先進(jìn)支持該屬性的.

      該屬性的作用是讓腳本能異步加載,也就是說(shuō)當瀏覽器遇到async屬性的 script 時(shí)瀏覽器加載css一樣是異步加載的

      javascript 動(dòng)態(tài)加載js文件

      原理很簡(jiǎn)單,創(chuàng )建一個(gè) script 節點(diǎn),給節點(diǎn)賦予 script 的屬性,然后 append 到 dom 的 head 標簽中.

      function loadJS(url){

       var Script = document.createElement('script');

       Script.setAttribute('src', url);

       Script.setAttribute('type', 'text/javascript');

       document.body.appendChild(Script);

       return Script;

      }

      如果我們同時(shí)加載多個(gè) javascript 文件

      loadJS('a.js');

      loadJS('b.js');

      上面的效果是,a.js 和 b.js 文件會(huì )被異步同時(shí)加載,如果 b.js 文件比 a.js 文件小的話(huà),很可能先加載執行 b.js ,完全不會(huì )按照書(shū)寫(xiě)結果加載執行

      所以,如果你的 b.js 文件有依賴(lài) a.js 的東西,那么就會(huì )報錯,因為解釋執行b.js 的時(shí)候,a.js 還在加載中.

      控制javascript 加載執行順序

      我們對代碼做如下改進(jìn)

      function loadJS(url, success) {

           var domScript = document.createElement('script');

           domScript.src = url;

           success = success || function () {

               };

           domScript.onload = domScript.onreadystatechange = function () {

             if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {

               success();

               this.onload = this.onreadystatechange = null;

               this.parentNode.removeChild(this);

             }

           }

           document.getElementsByTagName('head')[0].appendChild(domScript);

         }

      通過(guò)script 節點(diǎn)上的 onload 和 onreadystatechange 屬性來(lái)監聽(tīng)節點(diǎn) src 是否加載完成

      如果成功,調用回調函數 success();

      我們在調用此方法的時(shí)候,可以通過(guò) loadJS 回調函數來(lái)知道當前節點(diǎn)已經(jīng)加載完成,然后在回調函數里繼續加載其他 script 文件

      loadJS(getUrl('a.js'), function () {

           loadJS(getUrl('b.js'), function () {

             console.log('a.js ,b.js 加載完成');

           });

      });

      通過(guò)上面的方法加載,是一種同步阻塞加載, a.js 加載完成后才會(huì )加載執行 b.js 文件.

      如果你的 javascript 文件沒(méi)有相互依賴(lài)關(guān)系,不要使用這種方法.

      在线观看污视频网站,欧美精品一区二区久久久,日韩精品视频入口一区色,国产在线视频欧美亚综合

        1. <del id="uvx8x"></del>