js 异步加载 封装异步加载js函数

js加载的缺点

加载工具方法没必要阻塞文档,过多js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染的工作

有些工具方法需要按需加载,用到在加载,不用不加载

js异步加载

三种方案
defer

要等dom文档全部解析完才会被执行,IE独有,也可以把代码写在内部

<script type="text/javascript" src="./index.js" defer="defer"></script>
<script type="text/javascript" defer="defer">
	console.log('deffer')
</script>
async

加载完就执行,async 只能加载外部脚本,不可以把代码写在script内,IE9以下不兼容

<script type="text/javascript" src="./index.js" async="async"></script>
动态创建script

动态创建script,插入到DOM中,加载完后callback

var script = document.createElement('srcript');
script.type = "text/javascript";
script.src = "index.js";// 开始加载js文件 不执行

// script.onload = function(){ // js加载完触发  不兼容IE
//   //调用index的方法
// }
// IE
//script.onreadestatechange = function(){
//	if(script.readyState == "loaded" && script.readyState == //"complete"){
//		//调用index的方法
//	}
//}
//document.head.appengChild(script);//开始执行

// 兼容写法
if(script.readyState){
	script.onreadestateshange = function(){
	 	if(script.readyState == "loaded" || script.readyState ==  "complete"){
	 		//调用index的方法
	 	}
 	}
}else{
	script.onload = function(){ 
 	 	//调用index的方法
    }
}
document.head.appengChild(script);//开始执行

封装异步加载js函数
function loadScript(url,callback){
	var script = document.createElement('srcript');
	script.type = "text/javascript";
	
	if(script.readyState){ //IE
		script.onreadestatechange = function(){
		 	if(script.readyState == "loaded" || script.readyState ==  "complete"){
		 		callback()
		 	}
		 }
	}else{
		script.onload = function(){ 
	 	 	callback()
	    }
	}
	script.src = url; //放这里 防止事件还没绑定 url加载完了 就不会执行 callback
	document.head.appengChild(script);//开始执行
}
loadScript('./index.js',function(){
	test()
})

// 或 
// loadScript('./index.js','test()'); //eval(callback);//不建议用

// 或
// index.js
// obj = {
//	 test: function(){}
// }
// loadScript('./index.js','test'); //obj[callback]()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值