打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Ajax:请使用最新版本的XMLHTTP

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)
{
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);
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WinHttp中文版網頁協議命令庫,支持Get,Post,協議頭,Cookie處理,代理IP等,附詳解及示例
JS 读文件
子键hkeypb,数据2
原生JavaScript手写Ajax
解决若要安装MicrosoftOffice2010,需要MSXML版本6.10.1129的问题
缺少MSXML-Office2010安装错误
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服