您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關(guān)javascript如何按順序加載運行js方法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
瀏覽器會異步加載 javascript 文件,但是會按照引用文件中的書寫順序從上到下執(zhí)行解析 javascript
Defer屬性標記
defer是html4.0中定義的,該屬性使得瀏覽器能延遲腳本的執(zhí)行,等文檔完成解析完成后會按照他們在文檔出現(xiàn)順序再去下載解析。
也就是說defer屬性的 script 就類似于將 script 放在body中的加載 效果一致.
但是defer屬性在各個瀏覽器中支持程度有點不同,就是說,有的瀏覽器不完全支持.
Async屬性標注
async是HTML5新增的屬性, 大部分先進支持該屬性的.
該屬性的作用是讓腳本能異步加載,也就是說當(dāng)瀏覽器遇到async屬性的 script 時瀏覽器加載css一樣是異步加載的
javascript 動態(tài)加載js文件
原理很簡單,創(chuàng)建一個 script 節(jié)點,給節(jié)點賦予 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 文件小的話,很可能先加載執(zhí)行 b.js ,完全不會按照書寫結(jié)果加載執(zhí)行
所以,如果你的 b.js 文件有依賴 a.js 的東西,那么就會報錯,因為解釋執(zhí)行b.js 的時候,a.js 還在加載中.
控制javascript 加載執(zhí)行順序
我們對代碼做如下改進
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é)點上的 onload 和 onreadystatechange 屬性來監(jiān)聽節(jié)點 src 是否加載完成
如果成功,調(diào)用回調(diào)函數(shù) success();
我們在調(diào)用此方法的時候,可以通過 loadJS 回調(diào)函數(shù)來知道當(dāng)前節(jié)點已經(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 加載完成后才會加載執(zhí)行 b.js 文件.
如果你的 javascript 文件沒有相互依賴關(guān)系,不要使用這種方法.
關(guān)于“javascript如何按順序加載運行js方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。