| ReadyState取值 | 描述 |
0 | 描述一種"未初始化"狀態(tài);此時(shí),已經(jīng)創(chuàng)建一個(gè)XMLHttpRequest對(duì)象,但是還沒有初始化。 |
1 | 描述一種"發(fā)送"狀態(tài);此時(shí),代碼已經(jīng)調(diào)用了XMLHttpRequest open()方法并且XMLHttpRequest已經(jīng)準(zhǔn)備好把一個(gè)請(qǐng)求發(fā)送到服務(wù)器。 |
2 | 描述一種"發(fā)送"狀態(tài);此時(shí),已經(jīng)通過send()方法把一個(gè)請(qǐng)求發(fā)送到服務(wù)器端,但是還沒有收到一個(gè)響應(yīng)。 |
3 | 描述一種"正在接收"狀態(tài);此時(shí),已經(jīng)接收到HTTP響應(yīng)頭部信息,但是消息體部分還沒有完全接收結(jié)束。 |
4 | 描述一種"已加載"狀態(tài);此時(shí),響應(yīng)已經(jīng)被完全接收。 |
onreadystatechange事件
無(wú)論readyState值何時(shí)發(fā)生改變,XMLHttpRequest對(duì)象都會(huì)激發(fā)一個(gè)readystatechange事件。其中,onreadystatechange屬性接收一個(gè)EventListener值-向該方法指示無(wú)論readyState值何時(shí)發(fā)生改變,該對(duì)象都將激活。
responseText屬性
這個(gè)responseText屬性包含客戶端接收到的HTTP響應(yīng)的文本內(nèi)容。當(dāng)readyState值為0、1或2時(shí),responseText包含一個(gè)空字符串。當(dāng)readyState值為3(正在接收)時(shí),響應(yīng)中包含客戶端還未完成的響應(yīng)信息。當(dāng)readyState為4(已加載)時(shí),該responseText包含完整的響應(yīng)信息。
responseXML屬性
此responseXML屬性用于當(dāng)接收到完整的HTTP響應(yīng)時(shí)(readyState為4)描述XML響應(yīng);此時(shí),Content-Type頭部指定MIME(媒體)類型為text/xml,application/xml或以+xml結(jié)尾。如果Content-Type頭部并不包含這些媒體類型之一,那么responseXML的值為null。無(wú)論何時(shí),只要readyState值不為4,那么該responseXML的值也為null。
其實(shí),這個(gè)responseXML屬性值是一個(gè)文檔接口類型的對(duì)象,用來描述被分析的文檔。如果文檔不能被分析(例如,如果文檔不是良構(gòu)的或不支持文檔相應(yīng)的字符編碼),那么responseXML的值將為null。
status屬性
這個(gè)status屬性描述了HTTP狀態(tài)代碼,而且其類型為short。而且,僅當(dāng)readyState值為3(正在接收中)或4(已加載)時(shí),這個(gè)status屬性才可用。當(dāng)readyState的值小于3時(shí)試圖存取status的值將引發(fā)一個(gè)異常。
statusText屬性
這個(gè)statusText屬性描述了HTTP狀態(tài)代碼文本;并且僅當(dāng)readyState值為3或4才可用。當(dāng)readyState為其它值時(shí)試圖存取statusText屬性將引發(fā)一個(gè)異常。
三、 XMLHttpRequest對(duì)象的方法
XMLHttpRequest對(duì)象提供了各種方法用于初始化和處理HTTP請(qǐng)求,下列將逐個(gè)展開詳細(xì)討論。
abort()方法
你可以使用這個(gè)abort()方法來暫停與一個(gè)XMLHttpRequest對(duì)象相聯(lián)系的HTTP請(qǐng)求,從而把該對(duì)象復(fù)位到未初始化狀態(tài)。
open()方法
你需要調(diào)用open(DOMString method,DOMString uri,boolean async,DOMString username,DOMString password)方法初始化一個(gè)XMLHttpRequest對(duì)象。其中,method參數(shù)是必須提供的-用于指定你想用來發(fā)送請(qǐng)求的HTTP方法(GET,POST,PUT,DELETE或HEAD)。為了把數(shù)據(jù)發(fā)送到服務(wù)器,應(yīng)該使用POST方法;為了從服務(wù)器端檢索數(shù)據(jù),應(yīng)該使用GET方法。另外,uri參數(shù)用于指定XMLHttpRequest對(duì)象把請(qǐng)求發(fā)送到的服務(wù)器相應(yīng)的URI。借助于window.document.baseURI屬性,該uri被解析為一個(gè)絕對(duì)的URI-換句話說,你可以使用相對(duì)的URI-它將使用與瀏覽器解析相對(duì)的URI一樣的方式被解析。async參數(shù)指定是否請(qǐng)求是異步的-缺省值為true。為了發(fā)送一個(gè)同步請(qǐng)求,需要把這個(gè)參數(shù)設(shè)置為false。對(duì)于要求認(rèn)證的服務(wù)器,你可以提供可選的用戶名和口令參數(shù)。在調(diào)用open()方法后,XMLHttpRequest對(duì)象把它的readyState屬性設(shè)置為1(打開)并且把responseText、responseXML、status和statusText屬性復(fù)位到它們的初始值。另外,它還復(fù)位請(qǐng)求頭部。注意,如果你調(diào)用open()方法并且此時(shí)readyState為4,則XMLHttpRequest對(duì)象將復(fù)位這些值。
send()方法
在通過調(diào)用open()方法準(zhǔn)備好一個(gè)請(qǐng)求之后,你需要把該請(qǐng)求發(fā)送到服務(wù)器。僅當(dāng)readyState值為1時(shí),你才可以調(diào)用send()方法;否則的話,XMLHttpRequest對(duì)象將引發(fā)一個(gè)異常。該請(qǐng)求被使用提供給open()方法的參數(shù)發(fā)送到服務(wù)器。當(dāng)async參數(shù)為true時(shí),send()方法立即返回,從而允許其它客戶端腳本處理繼續(xù)。在調(diào)用send()方法后,XMLHttpRequest對(duì)象把readyState的值設(shè)置為2(發(fā)送)。當(dāng)服務(wù)器響應(yīng)時(shí),在接收消息體之前,如果存在任何消息體的話,XMLHttpRequest對(duì)象將把readyState設(shè)置為3(正在接收中)。當(dāng)請(qǐng)求完成加載時(shí),它把readyState設(shè)置為4(已加載)。對(duì)于一個(gè)HEAD類型的請(qǐng)求,它將在把readyState值設(shè)置為3后再立即把它設(shè)置為4。
send()方法使用一個(gè)可選的參數(shù)-該參數(shù)可以包含可變類型的數(shù)據(jù)。典型地,你使用它并通過POST方法把數(shù)據(jù)發(fā)送到服務(wù)器。另外,你可以顯式地使用null參數(shù)調(diào)用send()方法,這與不用參數(shù)調(diào)用它一樣。對(duì)于大多數(shù)其它的數(shù)據(jù)類型,在調(diào)用send()方法之前,應(yīng)該使用setRequestHeader()方法(見后面的解釋)先設(shè)置Content-Type頭部。如果在send(data)方法中的data參數(shù)的類型為DOMString,那么,數(shù)據(jù)將被編碼為UTF-8。如果數(shù)據(jù)是Document類型,那么將使用由data.xmlEncoding指定的編碼串行化該數(shù)據(jù)。
setRequestHeader()方法
該setRequestHeader(DOMString header,DOMString value)方法用來設(shè)置請(qǐng)求的頭部信息。當(dāng)readyState值為1時(shí),你可以在調(diào)用open()方法后調(diào)用這個(gè)方法;否則,你將得到一個(gè)異常。
getResponseHeader()方法
getResponseHeader(DOMString header,value)方法用于檢索響應(yīng)的頭部值。僅當(dāng)readyState值是3或4(換句話說,在響應(yīng)頭部可用以后)時(shí),才可以調(diào)用這個(gè)方法;否則,該方法返回一個(gè)空字符串。
getAllResponseHeaders()方法
該getAllResponseHeaders()方法以一個(gè)字符串形式返回所有的響應(yīng)頭部(每一個(gè)頭部占單獨(dú)的一行)。如果readyState的值不是3或4,則該方法返回null。
四、 發(fā)送請(qǐng)求
在AJAX中,許多使用XMLHttpRequest的請(qǐng)求都是從一個(gè)HTML事件(例如一個(gè)調(diào)用JavaScript函數(shù)的按鈕點(diǎn)擊(onclick)或一個(gè)按鍵(onkeypress))中被初始化的。AJAX支持包括表單校驗(yàn)在內(nèi)的各種應(yīng)用程序。有時(shí),在填充表單的其它內(nèi)容之前要求校驗(yàn)一個(gè)唯一的表單域。例如要求使用一個(gè)唯一的UserID來注冊(cè)表單。如果不是使用AJAX技術(shù)來校驗(yàn)這個(gè)UserID域,那么整個(gè)表單都必須被填充和提交。如果該UserID不是有效的,這個(gè)表單必須被重新提交。例如,一個(gè)相應(yīng)于一個(gè)要求必須在服務(wù)器端進(jìn)行校驗(yàn)的Catalog ID的表單域可能按下列形式指定:
| <form name="validationForm" action="validateForm" method="post"> <table> <tr><td>Catalog Id:</td> <td> <input type="text" size="20" id="catalogId" name="catalogId" autocomplete="off" onkeyup="sendRequest()"> </td> <td><div id="validationMessage"></div></td> </tr> </table></form> |
| <script type="text/javascript"> function sendRequest(){ var xmlHttpReq=init(); function init(){ if (window.XMLHttpRequest) { return new XMLHttpRequest(); } else if (window.ActiveXObject) { return new ActiveXObject("Microsoft.XMLHTTP"); } } </script> |
| var catalogId=encodeURIComponent(document.getElementById("catalogId").value); xmlHttpReq.open("GET", "validateForm?catalogId=" + catalogId, true); |
| xmlHttpReq.onreadystatechange=processRequest; |
| xmlHttpReq.send(null); |
五、 處理請(qǐng)求
在這個(gè)示例中,因?yàn)镠TTP方法是GET,所以在服務(wù)器端的接收servlet將調(diào)用一個(gè)doGet()方法,該方法將檢索在URL中指定的catalogId參數(shù)值,并且從一個(gè)數(shù)據(jù)庫(kù)中檢查它的有效性。
本文示例中的這個(gè)servlet需要構(gòu)造一個(gè)發(fā)送到客戶端的響應(yīng);而且,這個(gè)示例返回的是XML類型,因此,它把響應(yīng)的HTTP內(nèi)容類型設(shè)置為text/xml并且把Cache-Control頭部設(shè)置為no-cache。設(shè)置Cache-Control頭部可以阻止瀏覽器簡(jiǎn)單地從緩存中重載頁(yè)面。
| public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... ... response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); } |
| out.println("<catalogId>valid</catalogId>"); |
| function processRequest(){ if(xmlHttpReq.readyState==4){ if(xmlHttpReq.status==200){ processResponse(); } } } |
| var msg=xmlHttpReq.responseXML; |
| var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue; |
| if(catalogId=="valid"){ var validationMessage = document.getElementById("validationMessage"); validationMessage.innerHTML = "Catalog Id is Valid"; } else { var validationMessage = document.getElementById("validationMessage"); validationMessage.innerHTML = "Catalog Id is not Valid"; } |
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注