- if(this.ActiveXObject && !this.XMLHttpRequest ){
- var xmlHttpRequstActiveIds = [
- "Microsoft.XMLHTTP"//IE5的,最早的XHR实现
- ,"MSXML2.XMLHTTP" //偷懒的办法,调用的2与3.0的版本
- //,"MSXML2.XMLHTTP.3.0"//应该等价于MSXML2.XMLHTTP
- //,"Msxml2.XMLHTTP.4.0"
- ,"Msxml2.XMLHTTP.5.0" 4与5并非针对浏览器
- //,"Msxml2.XMLHTTP.6.0" IE6
- ];
- var xmlHttpRequstActiveId
- this.XMLHttpRequest = function(){
- if(xmlHttpRequstActiveId){
- return new ActiveXObject(xmlHttpRequstActiveId);
- }else{
- var i=xmlHttpRequstActiveIds.length;
- while(i --){
- try{
- var impl = new ActiveXObject(xmlHttpRequstActiveId = xmlHttpRequstActiveIds[i]);
- xmlHttpRequstActiveIds = null;
- return impl;
- }catch (e){}
- }
- }
- };
- }
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版本(最老的)。
要尝试调用更新的版本,则必须指明版本号,也就是使用上面具体列出的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){
}
}
}
}
}
{
var oReq = new XMLHttpRequest();
oReq.open("GET", "http://localhost/test.xml");
oReq.send();
alert(oReq.statusText);
}