异步加载又叫非阻塞,浏览器在加载执行 js 同时,还会继续进行后续页面的处理。
异步加载js,按需加载,用到的时候再加载,不用到不加载。
异步加载的三种方式:
1.defer属性:在文档完成解析完成开始执行,并且在DOMContentLoaded事件之前执行完成。仅支持IE,最好是外部的script使用。
2.async属性:加载完就执行,只能加载外部脚本,是W3C的标准。高版本的浏览器支持加载内部脚本,但是标准中不允许。
3.创建一个script标签,插入到DOM中。兼容性最好。
异步加载禁止使用document.write(),因为document.write()有可能会清空文档流
异步加载的兼容性写法:
function loadScript(url, callback){
var script = document.createElement('script');
script.type = "text/javascript";
if(script.readyState){
// 状态码 readyState-->complete loaded 表示ie中script加载完成了
script.onreadystatechange = function (){// ie
if(script.readyState == 'complete' || script.readyState == 'loaded'){
obj[callback]();
}
}
}else{
// 什么时候load.js加载完成了? 提示 onload
script.onload = function(){//加载完成的标志
// safari chrome firefox opera
obj[callback]();
}
}
script.src = url;//下载了指定地址的js文件
document.head.appendChild(script);//挂到DOM树上,此时才执行了js文件中的代码
}