1.XMLHttpRequest最先是在IE5中以ActiveX組件的形式實現的。非W3C標準javascript
2.建立XMLHttpRequest對象(因爲非標準因此實現方法不統一)java
--Internet Explorer把XMLHttpRequest實現爲一個ActiveX對象,程序員
--其餘瀏覽器(火狐,Safari,...)把它實現爲一個本地的JavaScript對象,瀏覽器
--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
--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>
--該事件處理函數由服務器觸發,而不是用戶。
--在Ajax執行過程當中,服務器會通知客戶端當前的通訊狀態。這依靠更新XMLHttpRequest對象的readyState來實現。改變readyState屬性是服務器對客戶端鏈接操做的一種方式。每次readyState屬性的改變都會觸發readystatechange事件。
--XMLHttpRequest對象的open方法容許程序員用一個Ajax調用向服務器發送請求。
--method:請求類型。相似「GET」或「POST」的字符串。若只想從服務器檢索一個文件,而不須要發送任何數據,使用GET(能夠在GET請求裏經過附加在URL上的查詢字符串來發送數據,不過數據大小限制爲2000個字符)。若須要向服務器發送數據,用POST。
--在某些狀況下,有些瀏覽器會把多個XMLHttpRequest請求的結果緩存在同一個URL。若是對每一個請求的響應不一樣,就會帶來很差的結果。在此將時間戳追加到URL的最後,就能確保URL的惟一性,從而避免瀏覽器緩存結果。
--url:路徑字符串,指向你所請求的服務器上的那個文件。能夠是絕對路徑或相對路徑。
--asynch:表示請求是否要異步傳輸,默認值爲true。指定true。在讀取後面的腳本以前,不須要等待服務器的響應。指定爲false,當腳本處理過程通過這點時,會停下來,一直等到Ajax請求執行完畢再繼續執行。
--readyState
--status
--responseText
--responseXML
--readyState屬性表示Ajax請求的當前狀態。它的值用數字表明。
----- 0 表明未初始化。尚未調用open方法
----- 1 表明正在加載。open方法已被調用,但send方法尚未被調用。
----- 2 表明已加載完畢。send已被調用。請求已經開始。
----- 3 表明交互中。服務器正在發送響應。
----- 4 表明完成。響應發送完畢。
--每次readyState值得改變,都會觸發readystatechange事件。若是把onreadystatechange事件處理函數賦給一個函數,那麼每次readyState值得改變都會引發該函數的執行。
--readyState值得變化都會因瀏覽器的不一樣而有所差別。可是,當請求結束的時候,每一個瀏覽器都會把readyState的值統一設爲4。
--服務器發送的每個響應也都帶有首部信息。三位數的狀態碼是服務器發送的響應中最重要的首部信息,而且屬於超文本傳輸協議中的一部分。
--經常使用狀態碼及其含義:
----- 404 沒找到頁面(not found)
----- 403 禁止訪問(forbidden)
----- 500 內部服務器出錯(internal service error)
----- 200 一切正常(ok)
----- 304 沒有被修改(not modified)
--在XMLhttpRequest對象中,服務器發送的狀態碼都保存在status屬性裏。經過把這個值和200或304比較,能夠確保服務器是否已發送了一個成功的響應。
--XMLHttpRequest的responseText屬性包含了從服務器發送的數據。它是一個HTML,XML或普通文本,這取決於服務器發送的內容。
--當readyState屬性值變爲4時,responseText屬性纔可用,代表Ajax請求已經結束。
--若是服務器返回的是XML,那麼數據將存儲在responseXML屬性中。
--只用服務器發送了帶有正確首部信息的數據時,responseXML屬性纔是可用的。MIME類型必須爲 text/xml 。
--當瀏覽器向服務器請求頁面時,它會伴隨這個請求發送一組首部信息。這些首部信息是一系列描述請求的元數據(metadata)。首部信息用來聲明一個請求時GET仍是POST。
--Ajax請求中,發送首部信息的工做能夠由setRequestHeader完成。
--參數header:首部的名字;參數value:首部的值。
--若是用POST請求向服務器發送數據,須要將「Content-type」的首部設置爲「application/x-www-urlencoded」。它會告知服務器正在發送數據,而且數據已經符合URL編碼了。
--該方法必須在open()以後才能調用。