[转]ajax:请使用最新版本

最近看到有不少朋友在问有关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)
{
         xmlhttp=new XMLHttpRequest(); 
}
if(!xmlhttp&&window.ActiveXObject)
{
 
 try
 { 
     xmlhttp=new ActiveXObject("Msxml2.XMLHTTP.5.0")
 }
 catch(e)
 {
  try
  {
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP.4.0")
  }
  catch(e){
   try
   {
    new ActiveXObject("Msxml2.XMLHTTP") 
   }
   catch(e)
   {
    try{
     new ActiveXObject("Microsoft.XMLHTTP")
    }catch(e){
 
    }
    
    
   }
   
   
  }
  
  
 }
 
 
}


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);
}
posted @ 2008-09-06 20:18  沉默杨  阅读(1260)  评论(1编辑  收藏  举报