同時讓我們高興得是xmlhttp並不是IE特有的東西,雖然目前還不是W3C的標準,不過IE, Netscape/Mozilla, 和Safari都支持。在IE中我們使用new ActiveXObject('MSXML2.XMLHTTP')或者new ActiveXObject("Microsoft.XMLHTTP")來獲得的xmlhttp對象實例,使用前者還是後者和客戶端機器安裝的MSXML版本有關。在Netscape/Mozilla和Safari中,使用new XMLHttpRequest()來獲得xmlhttp對象實例。比如在IE中,我們通常這樣使用:
var xmlhttp = null;
try
{
xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
}
catch(e)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e2){}
}
try
{
xmlhttp = new ActiveXObject("MSXML2.XMLHTTP");
}
catch(e)
{
try
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e2){}
}
使用xmlhttp對象其實是並不是什麼困難的事,它一共就6個方法8個屬性。不過它最主要的是提供了兩種執行模式:同步模式和異步模式。同步模式可以比較精確的控制程序流程,可是如果服務器的Response太慢,browser會有死掉失去相應的問題;而使用異步模式由於是事件觸發方式控制流程,會給程序運行帶來一些不可與預計的問題,因爲你不知道客戶端等待服務器Response的過程中,用戶會在browser裏做什麼操作。
下面是一個同步方式獲取服務器數據的簡單示例:
function GetRemoteData(url)
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
try
{
xmlhttp.open('GET', url, false);
if ( xmlhttp.status == 200 )
{
return xmlhttp.responseText;
}
throw '';
}
catch(e)
{
return '';
}
}
{
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
try
{
xmlhttp.open('GET', url, false);
if ( xmlhttp.status == 200 )
{
return xmlhttp.responseText;
}
throw '';
}
catch(e)
{
return '';
}
}
XMLHTTP對象的屬性和方法列表(來自IXMLHTTPRequest接口):
|
|
這裏面顯然就open方法比較麻煩,帶了一大堆參數,它們的含義分別是:
|
異步通訊的示例:
xmlhttp.open("GET", "default.aspx", true);
xmlhttp.onreadystatechange = function()
{
if ( xmlhttp.readyState==4 )
{
alert(xmlhttp.responseText);
}
}
xmlhttp.send(null);
xmlhttp.onreadystatechange = function()
{
if ( xmlhttp.readyState==4 )
{
alert(xmlhttp.responseText);
}
}
xmlhttp.send(null);
其實使用xmlhttp就這麼簡單,複雜的是服務器端數據的組織方式,而且需要開發人員同時熟悉Client和Server端的開發,才能事半功倍。可是好像說了半天這個玩意兒和xml沒有什麼關係啊,怎麼叫xmlhttp呢?我們注意到response的數據類型中有一個responseXML,不過它解析返回的XMLDocument屬於XMLDOM的內容了,和使用xmlhttp來和服務器通訊的關係並不大,以後再來細說。