【XMLHttpRequest的概述】
1.XMLHttpRequest最早是在IE5中以ActiveX組件的形式實現的。非W3C標准
2.創建XMLHttpRequest對象(由於非標准所以實現方法不統一)
--Internet Explorer把XMLHttpRequest實現為一個ActiveX對象,
--其他瀏覽器(火狐,Safari,...)把它實現為一個本地的JavaScript對象,
--XMLHttpRequest在不同瀏覽器上的實現是兼容的,所以可以用同樣的方式訪問XMLHttpRequest實例的屬性和方法,而不論這個實例創建的方法是什么。
【創建XMLHttpRequest對象】
為了每次寫Ajax的時候都節省一點時間,可以把對象檢測的內容打包成一個可復用的函數:
1 function getHTTPObject(){ 2 var xhr = false; 3 if(window.XMLHttpRequest){ 4 xhr = new XMLHttpRequest(); 5 }else if(window.ActiveXObject){ 6 xhr = new ActiveXObject("Microsoft.XMLHTTP"); 7 } 8 return xhr; 9 }
說明:對window.XMLHttpRequest的調用會返回一個對象或null,if語句會把調用返回的結果看作是true或false(如果返回對象則為true,返回null則為false)。如果XMLHttpRequest對象存在,則把xhr的值設為該對象的新實例。如果不存在,就去檢測ActiveObject的實例是否存在,如果答案是肯定的,則把微軟XMLHTTP的新實例賦給xhr。
【發送請求】
1.利用XMLHttpRequest實例與服務器進行通信包含以下3個關鍵部分:
--onreadystatechange事件處理函數
--open方法
--send方法
實踐:
首先,創建一個動態項目工程,
index.jsp:
1 <body> 2 3 <a href="HelloAjax.txt">Hello Ajax</a> 4 5 </body>
HelloAjax.txt:
內容為:Hello Ajax!
運行:
點擊“Hello Ajax”,
則會跳到He'llAjax.txt。
下面,用Ajax實現彈出這個內容。
1 <script type="text/javascript"> 2 window.onload = function(){ 3 //1.獲取a節點,並對其添加 onclick 響應函數 4 document.getElementByTagName("a")[0].onclick = function(){ 5 6 //3.創建一個XMLHttpRequest 對象 7 var request = new XMLHttpRequest(); 8 9 //4.准備發送請求的數據:url 10 var url = this.href; 11 var method = "GET"; 12 13 //5.調用XMLHttpRequest 對象 的open 方法 14 request.open(method,url); 15 16 //6.調用XMLHttpRequest 對象 的send方法 17 request.send(null); 18 19 //7.為XMLHttpRequest 對象添加 onreadystatechange響應函數 20 request.onreadystatechange = function(){ 21 //8.判斷響應是否完成:XMLHttpRequest 對象的readyState屬性值為 4 的時候 22 if(reuqest.state == 4){ 23 //9.再判斷響應是否可用:XMLHttpRequest 對象 status 屬性值 為200 24 if(request.status == 200 || request.status == 304){ 25 //10.打印響應結果:responseText 26 alert(request.responseText); 27 } 28 } 29 } 30 //2.取消 a 節點的默認行為 31 return false; 32 } 33 } 34 35 </script> 36 </head> 37 <body> 38 39 <a href="HelloAjax.txt">Hello Ajax</a> 40 41 </body>
【發送請求】
1.onreadystatechange:
--該事件處理函數由服務器觸發,而不是用戶。
--在Ajax執行過程中,服務器會通知客戶端當前的通信狀態。這依靠更新XMLHttpRequest對象的readyState來實現。改變readyState屬性是服務器對客戶端連接操作的一種方式。每次readyState屬性的改變都會觸發readystatechange事件。
2.open(method,url,asynch)
--XMLHttpRequest對象的open方法允許程序員用一個Ajax調用向服務器發送請求。
--method:請求類型。類似“GET”或“POST”的字符串。若只想從服務器檢索一個文件,而不需要發送任何數據,使用GET(可以在GET請求里通過附加在URL上的查詢字符串來發送數據,不過數據大小限制為2000個字符)。若需要向服務器發送數據,用POST。
--在某些情況下,有些瀏覽器會把多個XMLHttpRequest請求的結果緩存在同一個URL。如果對每個請求的響應不同,就會帶來不好的結果。在此將時間戳追加到URL的最后,就能確保URL的唯一性,從而避免瀏覽器緩存結果。
--url:路徑字符串,指向你所請求的服務器上的那個文件。可以是絕對路徑或相對路徑。
--asynch:表示請求是否要異步傳輸,默認值為true。指定true。在讀取后面的腳本之前,不需要等待服務器的響應。指定為false,當腳本處理過程經過這點時,會停下來,一直等到Ajax請求執行完畢再繼續執行。
【接收響應】
1.用XMLHttpRequest的方法可向服務器發送請求。在Ajax處理過程中,XMLHttpRequest的如下屬性可被服務器更改:
--readyState
--status
--responseText
--responseXML
2.readyState
--readyState屬性表示Ajax請求的當前狀態。它的值用數字代表。
----- 0 代表未初始化。還沒有調用open方法
----- 1 代表正在加載。open方法已被調用,但send方法還沒有被調用。
----- 2 代表已加載完畢。send已被調用。請求已經開始。
----- 3 代表交互中。服務器正在發送響應。
----- 4 代表完成。響應發送完畢。
--每次readyState值得改變,都會觸發readystatechange事件。如果把onreadystatechange事件處理函數賦給一個函數,那么每次readyState值得改變都會引起該函數的執行。
--readyState值得變化都會因瀏覽器的不同而有所差異。但是,當請求結束的時候,每個瀏覽器都會把readyState的值統一設為4。
3.status
--服務器發送的每一個響應也都帶有首部信息。三位數的狀態碼是服務器發送的響應中最重要的首部信息,並且屬於超文本傳輸協議中的一部分。
--常用狀態碼及其含義:
----- 404 沒找到頁面(not found)
----- 403 禁止訪問(forbidden)
----- 500 內部服務器出錯(internal service error)
----- 200 一切正常(ok)
----- 304 沒有被修改(not modified)
--在XMLhttpRequest對象中,服務器發送的狀態碼都保存在status屬性里。通過把這個值和200或304比較,可以確保服務器是否已發送了一個成功的響應。
4.responseText
--XMLHttpRequest的responseText屬性包含了從服務器發送的數據。它是一個HTML,XML或普通文本,這取決於服務器發送的內容。
--當readyState屬性值變為4時,responseText屬性才可用,表明Ajax請求已經結束。
5.responseXML
--如果服務器返回的是XML,那么數據將存儲在responseXML屬性中。
--只用服務器發送了帶有正確首部信息的數據時,responseXML屬性才是可用的。MIME類型必須為 text/xml 。
6.setRequestHeader(header,value)
--當瀏覽器向服務器請求頁面時,它會伴隨這個請求發送一組首部信息。這些首部信息是一系列描述請求的元數據(metadata)。首部信息用來聲明一個請求時GET還是POST。
--Ajax請求中,發送首部信息的工作可以由setRequestHeader完成。
--參數header:首部的名字;參數value:首部的值。
--如果用POST請求向服務器發送數據,需要將“Content-type”的首部設置為“application/x-www-urlencoded”。它會告知服務器正在發送數據,並且數據已經符合URL編碼了。
--該方法必須在open()之后才能調用。