zoukankan      html  css  js  c++  java
  • 无阻塞加载脚本

    通常加载页面的时候,对于组件是并行下载的,现代大部分浏览器对于Js同样也是支持并行下载,但是在脚本下载、解析并执行完毕之前,不会开始下载任何其他内容。

    正常引入:

    可以看出,在脚本下载完毕后的一段时间内(该时间在解析执行脚本),不会对其他组件进行下载,以下几种方案解决该问题。

    1. XHR Eval加载脚本:

    即使用ajax引入脚本,并通过eval对其执行。

    代码:

     

    var xhrObj = getXHRObject();
    
      xhrObj.onreadystatechange = function(){
    
          if(xhrObj.readyState == 4 && xhrObj.status == 200){
    
               eval(xhrObj.respoenseText);
    
          }
    
      }
    
      xhrObj.open('GET', 'js/User/search.js', true);
    
      xhrObj.send();
    
      function getXHRObject(){
    
          var xhrObj = false;
    
          if(window.XMLHttpRequest){
    
                xhrObj = new XMLHttpRequest();
    
            }else{
    
                //IE6,5
    
                xhrObj = new ActiveXObject("Microsoft.XMLHTTP");
    
            }
    
        return xhrObj;
    
      };

     

     

    该方法的主要缺点是:脚本必须部署在和主页面相同的域中,参见同源策略。

    2.XHR注入:

    类似于XHR Eval,XHR注入也是通过ajax来获取脚本,不同的是该方法为创建一个script的DOM元素,并将脚本内容插入。

    代码(getXHRObject代码如上):

     

    var xhrObj = getXHRObject();
    
      xhrObj.onreadystatechange = function(){
    
          if(xhrObj.readyState == 4 && xhrObj.status == 200){
    
               var scriptElm = document.createElement('script');
    
               document.getElementsByTagName('head')[0].appendChild(scriptElem);
    
               scriptElm.text = xhrObj.responseText;
    
          }
    
      }
    
    xhrObj.open('GET', 'js/User/search.js', true);
    
      xhrObj.send();

     

     

    缺点:同上 受同源策略的影响。

    3.Iframe引入:

    该方法为将js改成html文件,并把外部脚本写进为内行脚本,同时需要对父级和iframe文档进行关联,同样受同源策略的影响。

    <iframe src="search.html" width=0 height=0 frameborder="0"></iframe>

     

    缺点:iframe消耗性能大,维护性低,不推荐使用。

    4.Script DOM Element

    通过创建一个script的DOM元素,并设置其src引用脚本。

     

    代码:

     

    var scriptElm = document.createElement('script');
    
      scriptElm.src = "js/User/search.js";
    
               document.getElementsByTagName('head')[0].appendChild(scriptElm);

     

     

     

    优点:代码短,不受同源策略影响,无需重构代码。

    5.Defer

    大部分浏览器支持的属性 在引用时加入

     

    代码:

    <script defer src="js/User/search.js"  ></script>

  • 相关阅读:
    spring初始化bean时执行某些方法完成特定的初始化操作
    flask与数据库连接相关操作
    解决flask中文乱码的问题
    flask(1)
    First Unique Character in a String (找到一个字符串中第一个不重复的字符)
    Java hashCode() 方法
    Java 类和对象
    Java 一维数组的定义和初始化
    Maven 在运行部署的时候是如何确定推送到 releases 还是 snapshots 仓库的
    Samples for Parallel Programming with the .NET Framework
  • 原文地址:https://www.cnblogs.com/Darlietoothpaste/p/6517018.html
Copyright © 2011-2022 走看看