zoukankan      html  css  js  c++  java
  • JS异步加载的三种方式

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

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

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

    3.除了以上两种方法,还有一种兼容自己封装的异步加载方式,即动态添加script标签也能实现异步加载。

      

    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);
    }
  • 相关阅读:
    ubuntu中apt-get安装与默认路径
    css计数器
    jq实现多级菜单
    video文件格式说明(笔记)
    css文字闪烁效果
    video设置视频的播放位置(本例中实现效果是视频第一次播放完成后,接下来中从视频的中间部位开始循环播放)
    css3鼠标经过出现转圈菜单(仿)
    jq弹框 (1)内容自适应宽度 2(内容框显示,几秒后自动消失)
    jq实现 元素显示后 点击页面的任何位置除元素本身外 隐藏元素
    nginx https配置记录
  • 原文地址:https://www.cnblogs.com/Walker-lyl/p/5298002.html
Copyright © 2011-2022 走看看