ajax:請使用最新版本

來源:互聯網
上載者:User
最近看到有不少朋友在問有關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);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.