源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-11-06 18:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:浅谈js文件引用方式及其同步执行与异步执行
任何以appendChild(scriptNode) 的方式引入的js文件都是异步执行的 (scriptNode 需要插入document中,只创建节点和设置 src 是不会加载 js 文件的,这跟 img 的与加载不同 ) html文件中的<script>标签中的代码或src引用的js文件中的代码是同步加载和执行的 html文件中的<script>标签中的代码使用document.write()方式引入的js文件是异步执行的 html文件中的<script>标签src属性所引用的js文件的代码内再使用document.write()方式引入的js文件是同步执行的 [b]1、[/b]
<script>
//同步加载执行的代码
</script>
[b]2、[/b]
<script src="xx.js"></script> //同步加载执行xx.js中的代码
[b]3、[/b]
<script>
document.write('<script src="xx.js"><\/script>');  //异步加载执行xx.js中的代码
</script>
[b]4、[/b]
<script src="xx.js"></script>
[b]xx.js中有下面代码:[/b]
document.write('<script src="11.js"><\/script>');  
document.write('<script src="22.js"><\/script>');  
则xx.js和11.js、22.js 都是同步加载和执行的。 如果 xx.js 以插入方式异步加载,则 11.js 和 22.js 仍然是同步加载的(异步中的同步,即,这2个文件的加载是分先后次序的) 测试:在11中 alert, 22中 document.write() ,可以看到 22中写入语句被阻塞 [b]5、[/b] 下面这种方式,xx.js会在appendChild执行之后异步加载执行
var script = document.createElement("script");
script.setAttribute("src","xx.js");
documenrt.getElementsByTagName("head")[0].appendChild(script);
一个加载 js 文件的 函数:
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 标签,IE 下有 onreadystatechange 事件, w3c 标准有 onload 事件   
//这些 readyState 是针对IE8及以下的,W3C 标准因为script 标签没有这个 onreadystatechange 所以也不会有 this.readyState , 
// 好在文件加载不成功 onload 不会执行,(!this.readyState) 是针对 W3C标准的
if ((!this.readyState) || this.readyState == "complete" || this.readyState == "loaded" ){ 
 callback();   
 }
 else
 {     
 alert("can not load the js file")   
 }  
 }
 }
对于第4点的测试(其中插入 alert 很容易看到加载时阻塞的) [b]tryjs.html[/b]
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

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


<body>

</body>
</html>
[b]tryjs.js[/b]
console.log('write begin');
document.write('<script src="try.1.js" onreadystatechange="console.log(\'file 1 callback \',this.readyState,\' IE\');" onload="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\');" onload="if(!document.all){console.log(\'file 2 callback,NOT IE \');}"><\/script>');
console.log('write finished');
[b]try.1.js[/b]
console.log('loadjs 1 begin');
console.log('loadjs 1 finished');
[b]try.2.js[/b]
console.log('loadjs 2 begin');
console.log('loadjs 2 finished');
测试结果(file 2 和 file 1 的 callback complete 在IE7\8\9次序不确定) [b]IE 7:[/b] 日志: 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 [b]IE8:[/b] 日志: 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 [b]IE9:[/b] 日志: 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 [b]FIREFOX:[/b] 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 [b]CHROME:[/b] 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 以上就是小编为大家带来的浅谈js文件引用方式及其同步执行与异步执行的全部内容了,希望对大家有所帮助,多多支持编程素材网~
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部