JS异步加载的三种方式

Posted 学如逆水行舟,不进则退。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS异步加载的三种方式相关的知识,希望对你有一定的参考价值。

  js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作。 有些工具方法需要按需加载,用到再加载,不用不加载,。

  默认正常模式下下,JS是同步加载的,即优先记载JS,只有当JS文件下载完,dom和css才开始加载,当某些事后我们需要JS异步加载,我们可以通过以下方式来设置异步加载,不同情况下选取不同方式即可

1.defer:defer
  JS异步下载,dom结构解析完(标签 + 样式(内容不一定下载完))才异步执行
  仅IE能用
  内部JS也能用该属性
  异步加载js不允许使用document.write,因为document.write会清除文档流,js标签还未加载就会被清除
  document.write()可用于初始化页面
2.(h5)async:async(asynchronous) ajax(asynchronous javascript and XML)
  JS异步加载,加载完毕后立刻异步执行
  IE8及以下不兼容
  内部JS不能用该属性

3.除了以上两种方法,还有一种兼容自己封装的异步加载方式

  

function asyncLoaded(url,callBack){/*url为js的链接,callBack为url的js中的函数(该函数调用应该写到匿名函数中,如function(){console.log(div.getScrollOffset())})*/
    var script = document.createElement(‘script‘);
    script.type = ‘text/javascript‘;
    /*if else 这几句话必须要写到这位置处,不能放最后,因为if中js加载中script.readyState存在好几种状态,
    只有状态改变‘readystatechange’事件才会触发,但现在浏览器加载速度很快,当解析到该事件时JS有可能以加载完,
    所以事件根本不会触发,所以要写到前面*/
    if(script.readystate){//兼容IE
        script.onreadystatechange = function() {//状态改变事件才触发
            if(script.readyState == ‘loaded‘ || script.readyState == ‘complete‘){    
                callBack();
                script.onreadystatechange = null;        
            }
        }
    }else{
        script.onload = function(e){
            callBack();
        }
    }        
    script.src = url;
    document.body.appendChild(script);
}

 

以上是关于JS异步加载的三种方式的主要内容,如果未能解决你的问题,请参考以下文章

js的异步加载及promise的三种状态

ajax异步请求的三种方式

图解script的三种加载方式 异步加载顺序

js中的事件绑定的三种方式

js异步问题怎么解决

VueJS + Webpack 代码分割的三种方式