最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript按順序加載運(yùn)行js方法

 更新時(shí)間:2017年12月01日 14:33:59   投稿:laozhang  
本篇文章主要教給大家如何在javascript中動(dòng)態(tài)加載按順序加載運(yùn)行js的方法以及實(shí)現(xiàn)代碼,需要的朋友參考學(xué)習(xí)下吧。

首先如果大家對(duì)JS動(dòng)態(tài)加載有不理解的地方可以參閱:

javascript動(dòng)態(tài)加載實(shí)現(xiàn)方法

動(dòng)態(tài)加載JS文件的三種方法

如何你的 script 上沒(méi)有任何 異步,阻塞 等標(biāo)注:

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

Defer屬性標(biāo)記

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

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

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

Async屬性標(biāo)注

async是HTML5新增的屬性, 大部分先進(jìn)支持該屬性的.
該屬性的作用是讓腳本能異步加載,也就是說(shuō)當(dāng)瀏覽器遇到async屬性的 script 時(shí)瀏覽器加載css一樣是異步加載的

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

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

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 文件小的話,很可能先加載執(zhí)行 b.js ,完全不會(huì)按照書(shū)寫(xiě)結(jié)果加載執(zhí)行

所以,如果你的 b.js 文件有依賴(lài) a.js 的東西,那么就會(huì)報(bào)錯(cuò),因?yàn)榻忉寛?zhí)行b.js 的時(shí)候,a.js 還在加載中.

控制javascript 加載執(zhí)行順序

我們對(duì)代碼做如下改進(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 節(jié)點(diǎn)上的 onload 和 onreadystatechange 屬性來(lái)監(jiān)聽(tīng)節(jié)點(diǎn) src 是否加載完成

如果成功,調(diào)用回調(diào)函數(shù) success();

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

loadJS(getUrl('a.js'), function () {
      loadJS(getUrl('b.js'), function () {
        console.log('a.js ,b.js 加載完成');
      });
});

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

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

相關(guān)文章

最新評(píng)論

乌拉特中旗| 如皋市| 咸阳市| 于田县| 衢州市| 措勤县| 遵义市| 郴州市| 嵊泗县| 五台县| 梁河县| 米林县| 兰考县| 启东市| 六枝特区| 颍上县| 金华市| 和平区| 共和县| 屯昌县| 莱西市| 浦北县| 高平市| 方城县| 平远县| 乌苏市| 蒙城县| 商水县| 北碚区| 宽甸| 紫金县| 榆林市| 尖扎县| 阿拉善左旗| 马公市| 平和县| 南京市| 岳西县| 乳山市| 当涂县| 海伦市|