• 高效地获取XMLhttp对象2


    查看了一下jQuery与dojo的源码,发现IE7在window.location.protocol === "file:" 的情况下是不能用原生XMLHttpRequest的。不过它们两者的代码都有些瑕疵。dojo1.4的问题在于每次调用其_xhrObj都要检测一遍要用何种方式生成XMLHttp对象,另,它犯了一个错误,浏览器是不支持ProgID为“Msxml2.XMLHTTP.4.0”的ActiveXObject对象,但支持它没有列举出来的ProgID为“Msxml2.XMLHTTP.6.0”的ActiveXObject对象,即使是IE6,只要安装了特定的补丁,就能使用它,要不,它只能使用ProgID为“Msxml2.XMLHTTP”的ActiveXObject对象。而这个错误恰好是jQuery犯了,当然这也不能说错误,对于IE6,jQuery永远使用IE5.5的ActiveXObject("Msxml2.XMLHTTP")。看下面源码:

    xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
    			function() {
    				return new window.XMLHttpRequest();
    			} :
    			function() {
    				try {
    					return new window.ActiveXObject("Microsoft.XMLHTTP");
    				} catch(e) {}
    			},
    

    假若当前浏览器为IE8,但window.location.protocol === "file:" 那么jQuery依然会用IE5.5的ActiveXObject(" Msxml2.XMLHTTP")。这是非常不合常理的,因为IE8已经修复这个bug,并且增添了许多新的特性。由于IE7的问题,我原来的惰性函数取XMLhttp对象的方式已经行不通。嘛,要实现隋性函数的效果,我们还有自动执行函数,下面是我的新方法:

          var xhr ;
          (function(){
            var s = ["XMLHttpRequest",
              "ActiveXObject('Msxml2.XMLHTTP.6.0')",
              "ActiveXObject('Msxml2.XMLHTTP.3.0')",
              "ActiveXObject('Msxml2.XMLHTTP')",
              "ActiveXObject('Microsoft.XMLHTTP')"];
            //使用eval大法防止IE的条件编译在压缩时被删掉
            if(eval("''+/*@cc_on"+" @_jscript_version@*/-0") === 5.7 &&
              location.protocol === "file:"){
              s.shift();
            }
            for(var i = 0 ; i< s.length;i++){
              try{
                if(eval("new "+s[i])){
                  xhr = s[i]
                  break;
                }
              }catch(e){}
            }
          })();
          var getXhr = new Function( "return new "+xhr)
          
    

  • 相关阅读:
    1697 ⑨要写信
    1220 数字三角形
    4979 数塔
    bzoj1618[Usaco2008 Nov]Buying Hay 购买干草
    bzoj1066[SCOI2007]蜥蜴
    bzoj1008[HNOI2008]越狱
    cf437D The Child and Zoo
    cf437C The Child and Toy
    cf437B The Child and Set
    cf437A The Child and Homework
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1716486.html
Copyright © 2020-2023  润新知