日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

js文件引用方式及其同步执行与异步执行

發(fā)布時(shí)間:2025/7/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js文件引用方式及其同步执行与异步执行 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

詳見: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp74

?

任何以appendChild(scriptNode)?的方式引入的js文件都是異步執(zhí)行的?(scriptNode?需要插入document中,只創(chuàng)建節(jié)點(diǎn)和設(shè)置?src?是不會(huì)加載?js?文件的,這跟?img?的與加載不同?)???
html文件中的<script>標(biāo)簽中的代碼或src引用的js文件中的代碼是同步加載和執(zhí)行的
html文件中的<script>標(biāo)簽中的代碼使用document.write()方式引入的js文件是異步執(zhí)行的
html文件中的<script>標(biāo)簽src屬性所引用的js文件的代碼內(nèi)再使用document.write()方式引入的js文件是同步執(zhí)行的

1、

<script>

//同步加載執(zhí)行的代碼

</script>

2、

<script?src="xx.js"></script>??//同步加載執(zhí)行xx.js中的代碼

3、

<script>

document.write('<script?src="xx.js"><\/script>');???//異步加載執(zhí)行xx.js中的代碼

</script>

4、

<script?src="xx.js"></script>

xx.js中有下面代碼:

document.write('<script?src="11.js"><\/script>');???

document.write('<script?src="22.js"><\/script>');???

則xx.js和11.js、22.js?都是同步加載和執(zhí)行的。

如果?xx.js?以插入方式異步加載,則?11.js?和?22.js?仍然是同步加載的(異步中的同步,即,這2個(gè)文件的加載是分先后次序的)

測(cè)試:在11中?alert,?22中?document.write()?,可以看到?22中寫入語句被阻塞

5、

下面這種方式,xx.js會(huì)在appendChild執(zhí)行之后異步加載執(zhí)行

var?script?=?document.createElement("script");

script.setAttribute("src","xx.js");

documenrt.getElementsByTagName("head")[0].appendChild(script);

???

?

一個(gè)加載?js?文件的?函數(shù):

var?loadJS?=?function(url,callback){??var?head?=?document.getElementsByTagName('head')[0],???script?=?document.createElement('script');????script.src?=?url;???script.type?=?"text/javascript";???head.appendChild(?script);

???script.onload?=?script.onreadystatechange?=?function(){

//script?標(biāo)簽,IE?下有?onreadystatechange?事件,?w3c?標(biāo)準(zhǔn)有?onload?事件?????

//這些?readyState?是針對(duì)IE8及以下的,W3C?標(biāo)準(zhǔn)因?yàn)閟cript?標(biāo)簽沒有這個(gè)?onreadystatechange?所以也不會(huì)有?this.readyState?,?

//?好在文件加載不成功?onload?不會(huì)執(zhí)行,(!this.readyState)?是針對(duì)?W3C標(biāo)準(zhǔn)的

if?((!this.readyState)?||?this.readyState?==?"complete"?||?this.readyState?==?"loaded"?){?

?????????callback();??????}else{??????????alert("can?not?load?the?js?file")??????}???}}

?

對(duì)于第4點(diǎn)的測(cè)試(其中插入?alert?很容易看到加載時(shí)阻塞的)

tryjs.html

<!DOCTYPE?html>
<html>
<head>
<meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/>

<script?src="tryjs.js"?
οnlοad="if(!document.all){console.log('outer?js?callback,?not?IE');}"?
onreadystatechange="console.log('outer?js?callback?',this.readyState,'?IE');"></script>


<body>

</body>
</html>

?

tryjs.js

console.log('write?begin');
document.write('<script?src="try.1.js"?onreadystatechange="console.log(\'file?1?callback?\',this.readyState,\'?IE\');"?οnlοad="if(!document.all){console.log(\'file?1?callback,NOT?IE?\');}"><\/script>');
document.write('<script?src="try.2.js"?onreadystatechange="console.log(\'file?2?callback?\',this.readyState,\'?IE\');"?οnlοad="if(!document.all){console.log(\'file?2?callback,NOT?IE?\');}"><\/script>');
console.log('write?finished');

try.1.js
console.log('loadjs?1?begin');
console.log('loadjs?1?finished');

?

try.2.js

console.log('loadjs?2?begin');
console.log('loadjs?2?finished');

?

測(cè)試結(jié)果(file?2?和?file?1?的?callback?complete?在IE7\8\9次序不確定

IE?7:
日志:?outer?js?callback?loading?IE?
日志:?outer?js?callback?loaded?IE?
日志:?write?begin?
日志:?write?finished?
日志:?outer?js?callback?complete?IE?
日志:?file?1?callback?loading?IE?
日志:?file?2?callback?loading?IE?
日志:?loadjs?1?begin?
日志:?loadjs?1?finished?
日志:?loadjs?2?begin?
日志:?loadjs?2?finished?
日志:?file?2?callback?complete?IE?
日志:?file?1?callback?complete?IE?


IE8:
日志:?outer?js?callback?loading?IE?
日志:?outer?js?callback?loaded?IE?
日志:?write?begin?
日志:?write?finished?
日志:?outer?js?callback?complete?IE?
日志:?file?1?callback?loading?IE?
日志:?file?2?callback?loading?IE?
日志:?loadjs?1?begin?
日志:?loadjs?1?finished?
日志:?loadjs?2?begin?
日志:?loadjs?2?finished?
日志:?file?2?callback?complete?IE?
日志:?file?1?callback?complete?IE?

IE9:
日志:?write?begin?
日志:?write?finished?
日志:?outer?js?callback?complete?IE?
日志:?file?1?callback?loading?IE?
日志:?file?2?callback?loading?IE?
日志:?loadjs?1?begin?
日志:?loadjs?1?finished?
日志:?loadjs?2?begin?
日志:?loadjs?2?finished?
日志:?file?1?callback?complete?IE?
日志:?file?2?callback?complete?IE?



FIREFOX:
write?begin?
write?finished
outer?js?callback,?not?IE
loadjs?1?begin
loadjs?1?finished
file?1?callback,NOT?IE
loadjs?2?begin
loadjs?2?finished
file?2?callback,NOT?IE


CHROME:
write?begin?????
write?finished????
outer?js?callback,?not?IE????
loadjs?1?begin????
loadjs?1?finished????
file?1?callback,NOT?IE?
loadjs?2?begin????
loadjs?2?finished????
file?2?callback,NOT?IE?

總結(jié)

以上是生活随笔為你收集整理的js文件引用方式及其同步执行与异步执行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。