查看了一下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)