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

javascript按順序加載運行js方法

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

Defer屬性標記

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

也就是說defer屬性的 script 就類似于將 script 放在body中的加載 效果一致.

但是defer屬性在各個瀏覽器中支持程度有點不同,就是說,有的瀏覽器不完全支持.

Async屬性標注

async是HTML5新增的屬性, 大部分先進支持該屬性的.

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

javascript 動態加載js文件

原理很簡單,創建一個 script 節點,給節點賦予 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;

}

如果我們同時加載多個 javascript 文件

loadJS('a.js');

loadJS('b.js');

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

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

控制javascript 加載執行順序

我們對代碼做如下改進

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);

   }

通過script 節點上的 onload 和 onreadystatechange 屬性來監聽節點 src 是否加載完成

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

我們在調用此方法的時候,可以通過 loadJS 回調函數來知道當前節點已經加載完成,然后在回調函數里繼續加載其他 script 文件

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

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

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

     });

});

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

如果你的 javascript 文件沒有相互依賴關系,不要使用這種方法.

久久免费小视频,久久久影院亚洲午夜,久久成了视频免费观看,久久久永久免费视频
日韩综合一区二区 | 亚洲手机在线人成网站 | 亚洲中文字幕一区精品 | 亚洲午夜片在线 | 日本免费中文字幕喷水 | 亚洲日本成本线在观看 |