Ruby's Louvre

每天学习一点点算法

导航

高效地获取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)
      

posted on 2010-04-20 20:16  司徒正美  阅读(3479)  评论(3编辑  收藏  举报