Ajax:请使用最新版本的XMLHTTP最近看到有不少朋友在问有关Ajax在IE中应用的问题时,都是用了这样的代码:
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
我就不考证这个代码是从哪儿抄来的了,但是它是有问题的,至少对于大多数客户端系统来说这是过时的。 Microsoft对XMLHTTP的支持不仅限于浏览器,而是面向整个系统和所有程序的,以COM组件的形式存在,出现过很多版本,我们按照先后次序列出如下: 在新的COM组件(DLL)中,都包含了以往的版本(向下兼容)。 ProgID=Microsoft.XMLHTTP.1.0 GUID={ED8C108E-4349-11D2-91A4-00C04F7969E8} TypeLib={D63E0CE2-A0A2-11D0-9C02-00C04FC99C8E} VersionIndependentProgID=Microsoft.XMLHTTP 位于C:\WINDOWS\system32\msxml.dll ProgID=Msxml2.XMLHTTP.2.6 GUID={f5078f1e-c551-11d3-89b9-0000f81fe221} TypeLib={f5078f18-c551-11d3-89b9-0000f81fe221} VersionIndependentProgID=Msxml2.XMLHTTP 位于C:\WINDOWS\system32\msxml2.dll ProgID=Msxml2.XMLHTTP.3.0 GUID={F5078F35-C551-11D3-89B9-0000F81FE221} TypeLib={F5078F18-C551-11D3-89B9-0000F81FE221} VersionIndependentProgID=Msxml2.XMLHTTP 位于C:\WINDOWS\system32\msxml3.dll ProgID=Msxml2.ServerXMLHTTP.3.0 GUID={AFB40FFD-B609-40A3-9828-F88BBE11E4E3} TypeLib={F5078F18-C551-11D3-89B9-0000F81FE221} VersionIndependentProgID=Msxml2.ServerXMLHTTP 位于C:\WINDOWS\system32\msxml3.dll ProgID=Msxml2.XMLHTTP.4.0 GUID={88D969C5-F192-11D4-A65F-0040963251E5} TypeLib={F5078F18-C551-11D3-89B9-0000F81FE221} 没有VersionIndependentProgID 位于C:\WINDOWS\system32\msxml4.dll ProgID=Msxml2.ServerXMLHTTP.4.0 GUID={88D969C6-F192-11D4-A65F-0040963251E5} TypeLib={F5078F18-C551-11D3-89B9-0000F81FE221} 没有VersionIndependentProgID 位于C:\WINDOWS\system32\msxml4.dll ProgID=Msxml2.XMLHTTP.5.0 GUID={88D969EA-F192-11D4-A65F-0040963251E5} TypeLib={F5078F18-C551-11D3-89B9-0000F81FE221} 没有VersionIndependentProgID 位于C:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSXML5.DLL ProgID=Msxml2.ServerXMLHTTP.5.0 GUID={88D969EB-F192-11D4-A65F-0040963251E5} TypeLib={F5078F18-C551-11D3-89B9-0000F81FE221} 没有VersionIndependentProgID 位于C:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSXML5.DLL 一般来说,新的版本会比旧的版本错误更少,性能更好。有时候大家遇到的一些莫名其妙的意外问题,或者效率不佳的情况正是旧版本中的bug,在新版本中可能已经得到改进了。所以我们应该优先考虑使用最新的版本。 像 new ActiveXObject("Microsoft.XMLHTTP") 这样的ActiveX对象调用的其实是1.0版本(最老的)。 而更多见的 new ActiveXObject("Msxml2.XMLHTTP") 调用的是2.6或3.0版本(如果客户端装有较新的,则调用的是较新的,查看注册表中 HKEY_CLASSES_ROOT\Msxml2.XMLHTTP\CurVer 项目的值就可以具体知道,如果是3.0版本的话,该值为"Msxml2.XMLHTTP.3.0"。) 要尝试调用更新的版本,则必须指明版本号,也就是使用上面具体列出的ProgID。例如5.0版本是 new ActiveXObject("Msxml2.XMLHTTP.5.0") 。 推荐写法: var xmlhttp=null; if(window.XMLHttpRequest) if(!xmlhttp){alert("XMLHTTP不可用。即将跳转到非Ajax页面。");location="nonAjax.htm"} try……catch语句在(系统未装Script5.6引擎情况下的)IE4.0及更早版本的IE浏览器中不被支持。不过这样的老系统应该已经很少了。况且我们也没有在古董客户端上支持Ajax的需求——凡是能想出这种古怪要求的家伙都应该去当艺术家,并且追寻梵高当年的道路。 在3.0及以后版本都有一个对应的ServerXMLHTTP。 ServerXMLHTTP除了支持XMLHTTP原有的方法之外,还额外支持以下方法: setTimeouts(resolveTimeout:I4; connectTimeout:I4; sendTimeout:I4; receiveTimeout:I4); waitForResponse([timeoutInSeconds:variant]): bool; getOption(option:SERVERXMLHTTP_OPTION): variant; setOption(option:SERVERXMLHTTP_OPTION; value:variant); setProxy(proxySetting:SXH_PROXY_SETTING; [varProxyServer:variant; varBypassList:variant]); setProxyCredentials(bstrUserName:BSTR; bstrPassword:BSTR); 也就是说可以设置超时、额外选项和自主选择代理服务器。但是不能再使用本地Cookie和某些HTTP 1.1特性。具体请参考MSDN。 补充说明,在ie7+中,使用的已经是内嵌的XMLHttpRequest对象。 if (window.XMLHttpRequest) { var oReq = new XMLHttpRequest(); oReq.open("GET", "http://localhost/test.xml"); oReq.send(); alert(oReq.statusText); } |
|