理解Javascript文件動(dòng)態(tài)加載
Javascript文件動(dòng)態(tài)加載一直是比較困擾的一件事情,像網(wǎng)絡(luò)上傳的比較常見(jiàn)的做法:
function loadjs(fileurl){
var sct = document.createElement("script");
sct.src = fileurl;
document.head.appendChild(sct);
}
然后我們來(lái)測(cè)試一下結(jié)果:
<html>
<head>
<link rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<script>
function loadjs(fileurl){
var sct = document.createElement("script");
sct.src = fileurl;
document.head.appendChild(sct);
}
loadjs("http://code.jquery.com/jquery-1.12.0.js");
loadjs("http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js")
loadjs("http://bootboxjs.com/bootbox.js")
</script>
</body>
</html>
代碼加載完后,會(huì)出現(xiàn)下圖的錯(cuò)誤:

jquery明明是加載在第一個(gè)處理,為什么還是報(bào)jQuery不存在的對(duì)象呢?
因?yàn)檫@樣加載,相當(dāng)于開(kāi)啟了三個(gè)線程,只是jquery這個(gè)文件先啟動(dòng)線程,而jquery執(zhí)行完這個(gè)線程的時(shí)間,超過(guò)了后面兩個(gè)時(shí)間. 因此后面執(zhí)行完的,可能沒(méi)能找到j(luò)query這個(gè)對(duì)象。
然這種方式怎么處理呢?
其實(shí)文件的加載是有個(gè)狀態(tài)處理的.文件的加載有個(gè)onload事件,就是可以監(jiān)聽(tīng)文件是否加載完成的事件.
因此我們可以考慮這個(gè)方法來(lái)處理我們想要的結(jié)果.我們用直觀的方式來(lái)處理.改進(jìn)后的代碼如下:
<html>
<head>
<link rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
<script>
function loadjs(fileurl, fn){
var sct = document.createElement("script");
sct.src = fileurl;
if(fn){
sct.onload = fn;
}
document.head.appendChild(sct);
}
loadjs("http://code.jquery.com/jquery-1.12.0.js",function(){
loadjs("http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js",function(){
loadjs("http://bootboxjs.com/bootbox.js")
})
});
</script>
</body>
</html>
OK,執(zhí)行完這個(gè)代碼之后,加載文件都是在前一個(gè)加載完成后,才會(huì)加載另外一個(gè),這樣就不會(huì)造成找不到用到的對(duì)象了.
然后我們來(lái)執(zhí)行一個(gè)彈出框的效果,代碼里面使用了 Bootbox.js 插件. 加載代碼如下:
loadjs("http://code.jquery.com/jquery-1.12.0.js",function(){
loadjs("http://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js",function(){
loadjs("http://bootboxjs.com/bootbox.js",function(){
bootbox.alert("Hello world!", function() {
Example.show("Hello world callback");
});
})
})
});
刷新頁(yè)面,就會(huì)直接顯示彈出框:

動(dòng)態(tài)加載的代碼,往往容易在這里花費(fèi)很多時(shí)間調(diào)試.大家最好的辦法就是寫(xiě)一個(gè)最簡(jiǎn)單的例子,理解其中的原因. 這里的代碼都可以進(jìn)行封裝,還可以加入CSS文件的加載.作為自己的插件使用。
- 學(xué)習(xí)javascript文件加載優(yōu)化
- JS 動(dòng)態(tài)加載js文件和css文件 同步/異步的兩種簡(jiǎn)單方式
- JS加載器如何動(dòng)態(tài)加載外部js文件
- 動(dòng)態(tài)加載js、css的簡(jiǎn)單實(shí)現(xiàn)代碼
- 動(dòng)態(tài)加載js、css的實(shí)例代碼
- 動(dòng)態(tài)加載js文件簡(jiǎn)單示例
- jquery及js實(shí)現(xiàn)動(dòng)態(tài)加載js文件的方法
- 如何動(dòng)態(tài)加載外部Javascript文件
- js實(shí)現(xiàn)動(dòng)態(tài)加載腳本的方法實(shí)例匯總
- 不使用script導(dǎo)入js文件的幾種方法
- 動(dòng)態(tài)加載JavaScript文件的3種方式
相關(guān)文章
js實(shí)現(xiàn)addClass,removeClass,hasClass的函數(shù)代碼
js實(shí)現(xiàn)addClass,removeClass,hasClass的函數(shù)代碼,需要的朋友可以參考下。2011-07-07
GreyBox技術(shù)總結(jié)(轉(zhuǎn))
GreyBox是一個(gè)遮罩層的組件也稱模式窗口或模態(tài)窗口(所謂模態(tài)窗口,就是指除非采取有效的關(guān)閉手段,用戶的鼠標(biāo)焦點(diǎn)或者輸入光標(biāo)將一直停留在其上的窗口),它運(yùn)行以后可以產(chǎn)生不錯(cuò)的界面。2010-11-11
javascript閉包的高級(jí)使用方法實(shí)例
這篇文章介紹了javascript閉包的高級(jí)使用方法實(shí)例,有需要的朋友可以參考一下2013-07-07
input 標(biāo)簽實(shí)現(xiàn)輸入框帶提示文字效果(兩種方法)
這篇文章主要介紹了input 標(biāo)簽實(shí)現(xiàn)輸入框帶提示文字效果(兩種方法),需要的朋友可以參考下2017-10-10
原生js jquery ajax請(qǐng)求以及jsonp的調(diào)用方法
下面小編就為大家?guī)?lái)一篇原生js jquery ajax請(qǐng)求以及jsonp的調(diào)用方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
JavaScript中forEach的錯(cuò)誤用法匯總
js中foreach是用于遍歷數(shù)組的方法,將遍歷到的元素傳遞給回調(diào)函數(shù),遍歷的數(shù)組不能是空的要有值,下面這篇文章主要給大家介紹了關(guān)于JavaScript中forEach的錯(cuò)誤用法,需要的朋友可以參考下2022-06-06
JavaScript屏蔽指定區(qū)域內(nèi)右鍵菜單
有時(shí)候需要屏蔽部分區(qū)域內(nèi)的右鍵菜單,下面的代碼大家可以測(cè)試下。2010-03-03
JavaScript實(shí)現(xiàn)點(diǎn)擊切換功能
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)點(diǎn)擊切換功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01

