XMLHttpRequest是XMLHttp組件的對象,通過這個對象,Ajax可以像傳統型應用程式一樣只與伺服器進行資料層的交換,而不必每次都重新整理介面,也不必每次將資料處理的工作都交給伺服器來做;這樣既減輕了伺服器負擔又回憶了響應速度,縮短了使用者的等待時間。
XMLHttpRequest對象與Ajax
在Ajax應用程式中,XMLHttpRequest對象負責將使用者資訊以非同步通訊地發送到伺服器端,並接收伺服器響應資訊和資料。
需要注意的是JavaScript本身並不具有向伺服器發送請求的能力,要麼使用window.open()方法重新開啟一個頁面,要麼使用XMLHttpRequest對象發送請求,不同的是,前者是普通的即同步互動模式,而後者是非同步互動模式。
XMLHttpRequest對象的屬性和方法。
IE5.0開始,開發人員就可以在WEB頁面內部使用XMLHTTP ActiveX組件擴充自身的功能,而Mozilla1.0及NetScape7則是建立繼承XML的代理類XMLHttpRequest;對於大多情況XMLHttpRequest和XMLHttp組件很相似,方法和屬性類似,只是部份屬性不同。以下代碼示範了如果在IE以及NetScape等瀏覽器中建立XMLHttpRequest對象。
<script language="javascript">
//定義一個變數
var http_request = false;
//IE瀏覽器中建立
http_request = new ActiveXObject("Msxml2.XMLHTTP");//新版本IE
http_request = new ActiveXObject("Microsoft.XMLHTTP");//舊版本IE
//Netscope瀏覽器
http_request = new XMLHttpRequest();
</script>
需要注意的是 在微軟最新的 IE7.0版本瀏覽器中也已經支援了XMLHttpRequest,也就是說在IE7.0中同時支援以及上二種建立方式。在我們開發AJAX應用程式時一定要注意要相容瀏覽器類型。
建立方式可以如下:
var http_request = false;
function createXMLHttpRequest()
{
http_request = false;
//開始初始化XMLHTTPRequest對象
if(window.XMLHttpRequest)//如果是window.XMLHttpRequest對象
{
//Mozilla,netscape 瀏覽器
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {//設定MiME類別
//有些版本的瀏覽器在處理伺服器返回的未包含XML mime-type頭部資訊的內容時會報錯,因此,要確保返回的內容包含text/xml資訊。
http_request.overrideMimeType("text/xml");
}
}
else if(window.ActiveXObject)//如果是window.ActiveXObject
{
//IE瀏覽器
try
{
http_request = new ActiveXObject("Msxml2.XMLHTTP");//IE較新版本
}
catch (e)
{
try
{
http_request = new ActiveXObiect("Microsoft.XMLHTTP"); //ie舊版本
}
catch (e){}
}
}
if(!http_request)
{
//異常,建立對象執行個體失敗
window.alert("不能建立XMLHttpRequest對象執行個體。");
return false;
}
}
這樣就是一個簡單的跨瀏覽器的建立方法。
另外XMLHttpRequest對象提供了一系列屬性和方法,來向伺服器端發起非同步HTTP請求,監聽伺服器狀態,並在伺服器完成資料響應處理之後接收伺服器端返回的資訊資料。下面是對其的說明:
XMLHttpRequest 對象屬性
onreadystatechange:指定當readyState屬性改變時的事件處理控制代碼,屬性唯寫。
XMLHttpRequest對象屬性onreadystatechange是readyState狀態改變的事件觸發程序,用來指定當readyState屬性發生改變時的處理事件。在使用過程中,通常通過將事件處理函數名稱賦予onreadystatechange的方式,來為XMLHttpRequest指定事件觸發程序,而在事件處理函數中判斷readyState狀態值並做相應的處理。
如上:http_request.onreadystatechange = processRequest;processRequest作為事件處理函數,並在processRequest函數體內在readyState狀態為 4 時開始執行。
readyState:返回當前請求的狀態,屬性唯讀。
這些狀態用長度為4的整形資料表示,其屬性的狀態含義如下:
0:未初始化(對象已經建立,但是未初始化,即尚未調用open方法建立http請求)
1:初始化(對象已經建立,但是未調用send方法發送http請求)
2:發送資料(send方法已經被調用,但是當前的狀態以及http頭未知)
3:資料傳送中(已經接收部分資料,因為響應及http頭不全,這時通過response系統方法擷取部分資料會出現錯誤)
4:傳送完成(資料完畢,此時可以通過response系統方法擷取完整的回應資料)
responseBody:將回應資訊本文以unsigned byte 數組形式返回,屬性唯讀。
responseText:以字串的形式返回伺服器響應資訊,屬性唯讀。
responseXML:將響應資訊格式化為XML Document對象返回,屬性唯讀。
XMLHttpRequest對象的方法以及含義如下:
abort:取消當前請求;
文法:http_request.abort();調用此方法,當前請求返回uninitialized狀態。
getAllResourceHeaders:擷取相應的全部http頭資訊;像JSP中的HttpServletRequest對象一樣,擷取http請求的 要求標頭資訊,文法:headers = http_request.getAllResourceHeaders();
getResourceHeader:從響應資訊中擷取指定的http頭資訊。
文法:head = http_request.getResourceHeader("header-name");
open:建立一個新的http請求,並指定此請求的方法,URL,以及驗證資訊(使用者名稱/密碼)。
文法:http_request.open(method,url,async,user,password);
async為布爾值,指定請求是否非同步方式,預設為true;如果為真,當state狀態改變時會調用onreadystatechange屬性指向的回呼函數。如果伺服器需要驗證,則應該指定使用者名稱和密碼 。
send:發送請求到http伺服器並接收回應。建立http請求後,就可以向伺服器發送http請求,send方法被調用
文法:http_request.send(varBody);
參數varBody為要發送給伺服器的內容。如果沒有內容要發送,varBody參數可以省略,但最好寫為null,因為如果省略不寫在Firfox中會報錯,所以就為http_request.send(null);。此方法的同步或非同步方式取決於open方法中的async參數。
setRequestHeader:單獨設定請求的某個頭。
status:返回當前HTTP請求的狀態代碼,屬性唯讀。如:404=“檔案未找到”,200=“成功”
statusText:返回當前HTTP請求的狀態行,屬性唯讀。