使用 XMLHttpRequest實現Ajax


【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()之后才能調用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM