XMLHttpRequest對象是當今所有AJAX和Web 2.0應用程序的技術基礎。盡管軟件經銷商和開源社團現在都在提供各種AJAX框架以進一步簡化XMLHttpRequest對象的使用;但是,我們仍然很有必要理解這個對象的詳細工作機制。
一、 引言
異步JavaScript與XML(AJAX)是一個專用術語,用于實現在客戶端腳本與服務器之間的數據交互過程。這一技術的優點在于,它向開發者提供了一種從Web服務器檢索數據而不必把用戶當前正在觀察的頁面回饋給服務器。與現代瀏覽器的通過存取瀏覽器DOM結構的編程代碼(JavaScript)動態地改變被顯示內容的支持相配合,AJAX讓開發者在瀏覽器端更新被顯示的HTML內容而不必刷新頁面。換句話說,AJAX可以使基于瀏覽器的應用程序更具交互性而且更類似傳統型桌面應用程序。
Google的Gmail和Outlook Express就是兩個使用AJAX技術的我們所熟悉的例子。而且,AJAX可以用于任何客戶端腳本語言中,這包括JavaScript,Jscript和VBScript。
AJAX利用一個構建到所有現代瀏覽器內部的對象-XMLHttpRequest-來實現發送和接收HTTP請求與響應信息。一個經由XMLHttpRequest對象發送的HTTP請求并不要求頁面中擁有或回寄一個<form>元素。AJAX中的"A"代表了"異步",這意味著XMLHttpRequest對象的send()方法可以立即返回,從而讓Web頁面上的其它HTML/JavaScript繼續其瀏覽器端處理而由服務器處理HTTP請求并發送響應。盡管缺省情況下請求是異步進行的,但是,你可以選擇發送同步請求,這將會暫停其它Web頁面的處理,直到該頁面接收到服務器的響應為止。
微軟在其Internet Explorer(IE) 5中作為一個ActiveX對象形式引入了XMLHttpRequest對象。其他的認識到這一對象重要性的瀏覽器制造商也都紛紛在他們的瀏覽器內實現了XMLHttpRequest對象,但是作為一個本地JavaScript對象而不是作為一個ActiveX對象實現。而如今,在認識到實現這一類型的價值及安全性特征之后,微軟已經在其IE 7中把XMLHttpRequest實現為一個窗口對象屬性。幸運的是,盡管其實現(因而也影響到調用方式)細節不同,但是,所有的瀏覽器實現都具有類似的功能,并且實質上是相同方法。目前,W3C組織正在努力進行XMLHttpRequest對象的標準化,并且已經發行了有關該W3C規范的一個草案。
本文將對XMLHttpRequest對象API進行詳細討論,并將解釋其所有的屬性和方法。
二、 XMLHttpRequest對象的屬性和事件
XMLHttpRequest對象暴露各種屬性、方法和事件以便于腳本處理和控制HTTP請求與響應。下面,我們將對此展開詳細的討論。
readyState屬性
當XMLHttpRequest對象把一個HTTP請求發送到服務器時將經歷若干種狀態:一直等待直到請求被處理;然后,它才接收一個響應。這樣以來,腳本才正確響應各種狀態-XMLHttpRequest對象暴露一個描述對象的當前狀態的readyState屬性,如表格1所示。
表格1.XMLHttpRequest對象的ReadyState屬性值列表。
ReadyState取值 | 描述 |
0
|
描述一種"未初始化"狀態;此時,已經創建一個XMLHttpRequest對象,但是還沒有初始化。 |
1
|
描述一種"發送"狀態;此時,代碼已經調用了XMLHttpRequest open()方法并且XMLHttpRequest已經準備好把一個請求發送到服務器。 |
2
|
描述一種"發送"狀態;此時,已經通過send()方法把一個請求發送到服務器端,但是還沒有收到一個響應。 |
3
|
描述一種"正在接收"狀態;此時,已經接收到HTTP響應頭部信息,但是消息體部分還沒有完全接收結束。 |
4
|
描述一種"已加載"狀態;此時,響應已經被完全接收。 |
onreadystatechange事件
無論readyState值何時發生改變,XMLHttpRequest對象都會激發一個readystatechange事件。其中,onreadystatechange屬性接收一個EventListener值-向該方法指示無論readyState值何時發生改變,該對象都將激活。
responseText屬性
這個responseText屬性包含客戶端接收到的HTTP響應的文本內容。當readyState值為0、1或2時,responseText包含一個空字符串。當readyState值為3(正在接收)時,響應中包含客戶端還未完成的響應信息。當readyState為4(已加載)時,該responseText包含完整的響應信息。
responseXML屬性
此responseXML屬性用于當接收到完整的HTTP響應時(readyState為4)描述XML響應;此時,Content-Type頭部指定MIME(媒體)類型為text/xml,application/xml或以+xml結尾。如果Content-Type頭部并不包含這些媒體類型之一,那么responseXML的值為null。無論何時,只要readyState值不為4,那么該responseXML的值也為null。
其實,這個responseXML屬性值是一個文檔接口類型的對象,用來描述被分析的文檔。如果文檔不能被分析(例如,如果文檔不是良構的或不支持文檔相應的字符編碼),那么responseXML的值將為null。
status屬性
這個status屬性描述了HTTP狀態代碼,而且其類型為short。而且,僅當readyState值為3(正在接收中)或4(已加載)時,這個status屬性才可用。當readyState的值小于3時試圖存取status的值將引發一個異常。
statusText屬性
這個statusText屬性描述了HTTP狀態代碼文本;并且僅當readyState值為3或4才可用。當readyState為其它值時試圖存取statusText屬性將引發一個異常。