1.defer:
在script标签里添加defer,用于外部链接js文件,也可以异步加载内部脚本,会等待dom树生成后再执行js脚本代码
<script src="01.js" defer ></script>
2.async:
只能异步加载外部的链接文件,不能加载内部脚本,并且js文件加载完成后立即执行
<script src="01.js" async></script>
3.按需加载:
节省资源:在需要用到的时候再去引入,不需要用的时候就不管
例:点击button按钮 引入01.js并执行 01.js文件里有demo( )
btn.onclick = function(){// 创建script标签var script = document.createElement('script');script.src = '01.js'; // 子线程下载js文件// 将这个script追加到body中document.body.appendChild(script);// 事件监听方法:onload 等待页面所有资源下载完成后再执行处理函数 //如果直接调用demo(),万一js文件没有下载完,就会报错script.onload = function(){demo();}}
为了兼容ie ie不一定有onload事件
// 按需加载 封装代码function loadScript(url,callback){// 1. 创建script标签var script = document.createElement('script');// 4. 监听script是否下载完成// ie中 onreadystatechange 监听对象的状态改变if(script.readyState){// 如果当前浏览器中有readState这个属性 再去监听script标签的状态改变script.onreadystatechange = function(){// 判断script是否加载完成if(script.readyState == 'loaded' || script.readyState == 'complate'){callback();}}}else{script.onload = function(){callback();}}// 异步加载js文件 已经变了下载完成,状态不会再发生变化,所以监听事件不会被触发,所以要将这行代码写在后面script.src = url; //将标签追加到body中document.body.appendChild(script);}loadScript('01.js',demo);