JavaScript script標(biāo)簽同步異步加載實(shí)現(xiàn)方式
同步加載
同步模式,又稱阻塞模式,會(huì)阻止瀏覽器的后續(xù)處理,停止后續(xù)的解析,只有當(dāng)當(dāng)前加載完成,才能進(jìn)行下一步操作。
<script src="http://xxx/script.js"></script> <!--所以一般建議把<script>標(biāo)簽放在<body>結(jié)尾處,這樣盡可能減少頁(yè)面阻塞。-->
異步加載
異步加載又叫非阻塞加載,瀏覽器在下載執(zhí)行js的同時(shí),還會(huì)繼續(xù)進(jìn)行后續(xù)頁(yè)面的處理。主要有三種方式。
defer
<script src="http://xxx/script.js" defer></script> <!--要等dom文檔全部解析完(dom樹生成)才會(huì)被執(zhí)行。-->
async
<script src="http://xxx/script.js" defer></script> <!--加載完就執(zhí)行;async只能加載外部腳本,不能寫js到標(biāo)簽里。-->
Script DOM Element
這種方法是在頁(yè)面中<script>標(biāo)簽內(nèi),用 js 創(chuàng)建一個(gè) script 元素并插入到 document 中。
以下是封裝函數(shù)兼容性的異步加載js文件,并且可以按需執(zhí)行該文件里面的函數(shù)(按需加載)
<script>
function loadScript(url,callback){
//url是按需加載的js文件
//callback是按需加載的js文件中某個(gè)函數(shù)
// 1. 創(chuàng)建一個(gè)script標(biāo)簽
var script = document.createElement('script');
// 處理ie的兼容
if(script.readyState){
script.onreadystatechange = function(){
// 如果script已經(jīng)下載完成
if(script.readyState == 'complete' || script.readyState == 'loaded'){
callback();
}
}
}else{
// 監(jiān)聽script的下載的狀態(tài) 當(dāng)狀態(tài)變?yōu)橄螺d完成后 再執(zhí)行callback
script.onload = function(){
callback();
}
}
//在后面引入的目的是如果在IE上如果下載太快(比讀程序還快)
//IE的readystatechange 事件檢測(cè)狀態(tài)碼的時(shí)候,它早已經(jīng)從loading變成complete或者loaded(以極快的速度加載完了文件,你還沒來(lái)得及檢測(cè))
// 那你再檢測(cè)它就不會(huì)變了,它一直都是complete或者loaded
//這個(gè)時(shí)候就是馬后炮了,檢測(cè)也沒用了。
// 2. 給script標(biāo)簽添加src 引入一個(gè)js文件
script.src = url;
// 3. 追加到body
document.body.appendChild(script);
}
</script>
補(bǔ)充:document三個(gè)狀態(tài)
document.readyState === "loading" //表示document仍在加載 document.readyState === "interactive"http://文檔已經(jīng)完成加載,文檔已被解析,但是諸如圖像,樣式表和框架之類的子資源仍在加載。 interactive //活躍狀態(tài),dom樹繪制完成 document.readyState === "complate" T文檔和所有子資源已完成加載。狀態(tài)表示 [load]
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
最簡(jiǎn)單的JavaScript圖片輪播代碼(兩種方法)
基于javascript代碼實(shí)現(xiàn)最簡(jiǎn)單的圖片輪播效果,非常簡(jiǎn)單,本文通過(guò)兩種方式給大家介紹最簡(jiǎn)單的圖片輪播,感興趣的朋友一起學(xué)習(xí)吧2015-12-12
微信小程序拍賣商品詳情頁(yè)設(shè)計(jì)與交互實(shí)現(xiàn)代碼(含倒計(jì)時(shí)、實(shí)時(shí)更新出價(jià))
這篇文章主要介紹了微信小程序拍賣商品詳情頁(yè)設(shè)計(jì)與交互實(shí)現(xiàn)代碼(含倒計(jì)時(shí)、實(shí)時(shí)更新出價(jià)),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
JavaScript實(shí)現(xiàn)枚舉的幾種方法總結(jié)
在前端開發(fā)中,我們可能經(jīng)常需要用到枚舉,使用枚舉的好處是為了讓代碼的可讀性更強(qiáng),避免直接使用數(shù)字或未知的字符串,但是在JavaScript中,要自己實(shí)現(xiàn)一個(gè)枚舉功能,那么大家能想到多少種實(shí)現(xiàn)枚舉的方法呢,我將介紹幾種實(shí)現(xiàn)枚舉的好方法2023-08-08
js調(diào)用后臺(tái)servlet方法實(shí)例
今天做歷史記錄查詢功能,遇到了前后臺(tái)方法互相調(diào)用的問(wèn)題,研究了一下,把成功經(jīng)驗(yàn)記錄一二。2013-06-06
JavaScript?邏輯或?||?的妙用及相關(guān)知識(shí)普及
本文給大家介紹了JavaScript中的邏輯或運(yùn)算符||的用法,包括其基本概念、真值和假值、常見應(yīng)用以及與其他邏輯運(yùn)算符的對(duì)比,感興趣的朋友跟隨小編一起看看吧2024-12-12
javascript 模擬坦克大戰(zhàn)游戲(html5版)附源碼下載
這篇文章主要介紹了javascript 模擬坦克大戰(zhàn)游戲關(guān)鍵點(diǎn)和遇到的問(wèn)題及實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-04-04
JavaScript高級(jí)程序設(shè)計(jì) XML、Ajax 學(xué)習(xí)筆記
JavaScript高級(jí)程序設(shè)計(jì) XML、Ajax 學(xué)習(xí)筆記,需要的朋友可以參考下。2011-09-09

