javascript按順序加載運(yùn)行js方法
首先如果大家對(duì)JS動(dòng)態(tài)加載有不理解的地方可以參閱:
javascript動(dòng)態(tài)加載實(shí)現(xiàn)方法
如何你的 script 上沒有任何 異步,阻塞 等標(biāo)注:
瀏覽器會(huì)異步加載 javascript 文件,但是會(huì)按照引用文件中的書寫順序從上到下執(zhí)行解析 javascript
Defer屬性標(biāo)記
defer是html4.0中定義的,該屬性使得瀏覽器能延遲腳本的執(zhí)行,等文檔完成解析完成后會(huì)按照他們?cè)谖臋n出現(xiàn)順序再去下載解析。
也就是說defer屬性的 script 就類似于將 script 放在body中的加載 效果一致.
但是defer屬性在各個(gè)瀏覽器中支持程度有點(diǎn)不同,就是說,有的瀏覽器不完全支持.
Async屬性標(biāo)注
async是HTML5新增的屬性, 大部分先進(jìn)支持該屬性的.
該屬性的作用是讓腳本能異步加載,也就是說當(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ì)按照書寫結(jié)果加載執(zhí)行
所以,如果你的 b.js 文件有依賴 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); }
通過script 節(jié)點(diǎn)上的 onload 和 onreadystatechange 屬性來監(jiān)聽節(jié)點(diǎn) src 是否加載完成
如果成功,調(diào)用回調(diào)函數(shù) success();
我們?cè)谡{(diào)用此方法的時(shí)候,可以通過 loadJS 回調(diào)函數(shù)來知道當(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 加載完成'); }); });
通過上面的方法加載,是一種同步阻塞加載, a.js 加載完成后才會(huì)加載執(zhí)行 b.js 文件.
如果你的 javascript 文件沒有相互依賴關(guān)系,不要使用這種方法.
相關(guān)文章
JS中數(shù)據(jù)類型的正確判斷方法實(shí)例
怎么去判斷一個(gè)數(shù)據(jù)屬于哪個(gè)數(shù)據(jù)類型,這個(gè)是很常見的操作,我們一般都會(huì)想到typeof和instanceof這兩個(gè)常見的方法,但有時(shí)候這兩種方法并不能滿足我們的需求,下面這篇文章主要給大家介紹了關(guān)于JS中數(shù)據(jù)類型的正確判斷方法,需要的朋友可以參考下2021-08-08Javascript排序算法之計(jì)數(shù)排序的實(shí)例
計(jì)數(shù)排序是一種高效的線性排序,它通過計(jì)算一個(gè)集合中元素楚翔的次數(shù)來確定集合如何排列,計(jì)數(shù)排序不需要進(jìn)行數(shù)據(jù)的比較,所有他的運(yùn)行效率前面介紹的都高2014-04-04JavaScript 隨機(jī)驗(yàn)證碼的生成實(shí)例代碼
這篇文章主要介紹了JavaScript 隨機(jī)驗(yàn)證碼的生成實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-09-09bootstrap實(shí)現(xiàn)點(diǎn)擊刪除按鈕彈出確認(rèn)框的實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了bootstrap實(shí)現(xiàn)點(diǎn)擊刪除按鈕彈出確認(rèn)框的方法,需要的朋友參考下吧2018-08-08優(yōu)雅而高效的JavaScript?try...catch語句詳解(js異常處理)
這篇文章主要給大家介紹了關(guān)于JavaScript中try...catch語句的相關(guān)資料,也就是js異常處理方法,try...catch是JavaScript中的錯(cuò)誤處理機(jī)制,它的作用是捕獲和處理可能發(fā)生的錯(cuò)誤,以避免程序崩潰,需要的朋友可以參考下2024-01-01Javascript實(shí)現(xiàn)跑馬燈效果的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄狫avascript實(shí)現(xiàn)跑馬燈效果的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05