最近看到有不少朋友在問有關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);
也就是說可以設定逾時、額外選項和自主選擇Proxy 伺服器。但是不能再使用本地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);
}