js加载的缺点

js的加载是同步的 当加载到js文件时 就阻断了html和css的加载
等js加载完并执行完后 再继续html和css的加载(这里不能并行执行的原因是js也能修改html和css)
但是加载工具方法没必要阻塞文档 这使得js加载会影响页面效率
一旦网速不好 那么整个网站将等待js加载而不进行后续渲染等工作

javascript 异步加载的三种方案

有些工具方法需要按需加载 用到再加载 不用就不加载 所以就使用到了异步加载
1 defer
异步加载 但要等到dom文档全部解析完才会被执行 可以把js写在script标签里
只有IE能用

2 async
异步加载 加载完就执行 async只能加载外部脚本 但不能把js写在script 标签里
W3C标准

因为1、2这两种方法执行时不阻塞页面 但是考虑到兼容性问题 但是这两个方案又不能同时写 所以由此引出了第三种方案
*3 创建script标签 来加载js 可以做到用到再加载 不用不加载

  1. <script>
  2. //创建script标签
  3. var script = document.createElement("script");
  4. //type写不写都行
  5. // script.type = "text/javascript";
  6. //下面就是异步加载js的过程 执行完下面这行代码后 系统就会下载地址里面的东西了
  7. //即开启一个线程去加载script标签
  8. script.src = "./index.js";
  9. //下载完后 只有把这个script标签添加到页面时才会执行 不然永远不会执行
  10. document.head.appendChild(script);
  11. </script>

注意如果想执行js文件中的方法 但是这里不能马上执行 因为下载文件需要时间的 可能没下载完
所以就用到了一个方法 下载完再执行方法 即load事件
封装一个兼容性的方法

  1. <script>
  2. function loadJS(url, callback) {
  3. //url表示导入文件路径 callback表示要调用的文件中的方法名
  4. var script = document.createElement("script");
  5. script.type = "text/javascript";
  6. if (script.readyState) {//IE
  7. script.onreadystatechange = function () {
  8. if (script.readyState == "complete" || script.readyState == "loaded") {
  9. callback();
  10. }
  11. }
  12. } else {
  13. script.onload = function () {
  14. callback();
  15. }
  16. }
  17. //如果js文件下载的很快 快到连触发事件的机会都没有 那么下面这行代码就不能写在事件前面
  18. //所以我们把它写在了事件后面
  19. script.src = url;
  20. document.head.appendChild(script);
  21. }
  22. //注意执行时会先预编译function loadJS 但是不会看函数里面的内容
  23. //只有函数被调用时才会看里面的内容 即文件还没加载 我们就想让他执行文件里面的函数
  24. //这时如果我们直接传一个函数名进去 系统就会报错 即未定义
  25. //所以我们就传个函数引用 然后里面放方法执行 系统读到时并不会读里面的内容
  26. loadJS('index.js',function(){
  27. test();
  28. });
  29. </script>