使用 XMLHttpRequest實現Ajax

【XMLHttpRequest的概述】

1.XMLHttpRequest最先是在IE5中以ActiveX組件的形式實現的。非W3C標準javascript

2.建立XMLHttpRequest對象(因爲非標準因此實現方法不統一java

--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。app

 

【發送請求】

1.利用XMLHttpRequest實例與服務器進行通訊包含如下3個關鍵部分:

--onreadystatechange事件處理函數異步

--open方法jsp

--send方法async

 

實踐:

首先,建立一個動態項目工程,

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()以後才能調用

相關文章
相關標籤/搜索