1. 程式人生 > >初識Ajax

初識Ajax

read 每一個 可選參數 介紹 dsta change 所有 技術 lob

本節要點:

  • 什麽是Ajax
  • XMLHttpRequest對象
  • 創建Ajax的過程

1 什麽是AJAX

AJAX是Asynchronous JavaScript And XML的縮寫,但是,很多被認為是“Ajax”的頁面並沒有使用JavaScript或xml,所以把Ajax定義為一種構建Web頁面的方法,使頁面像桌面應用一樣具有響應性和交互性,這種說法更合適。AJAX的主要用途是使用JavaScript從服務器獲取數據而不必刷新整個頁面。其中AJAX拆分開來解釋:

  • Asynchronous:發送請求後不等返回結果,由回調函數處理結果
  • JavaScript:向服務器發起請求,獲得返回結果,更新頁面
  • XML:封裝數據

2 XMLHttpRequest對象

XMLHttpRequest是整個Ajax技術的靈魂。可以說沒有XMLHttpRequest,就沒有Ajax。Ajax技術的核心是異步發送請求,而XMLHttpRequest則是異步發送請求的對象。

XMLHttpRequest對象不是一個國際標準。在不同瀏覽器中有不同的實現。要實現能夠跨越瀏覽器運行的Ajax應用,必須考慮所有的使用場合。使用時必須根據瀏覽器采用不同的語法進行創建。但對每一個都進行判斷不合實際,可以利用JavaScript的異常處理機制實現跨瀏覽器的XMLHttpRequest對象創建腳本。

示例:

var xmlhttp;

//IE瀏覽器

try{

xmlhttp= new ActiveXObject(‘Msxml2.XMLHTTP‘);

}catch(e){

try{

xmlhttp= new ActiveXObject(‘Microsoft.XMLHTTP‘);

}catch(e){

try{

//DOM 2瀏覽器

xmlhttp= new XMLHttpRequest();

}catch(e){}

}

}

3 創建Ajax的過程

3.1 構建Ajax應用

利用XMLHttpRequest(XHR)對象,每次構建Ajax應用必須遵循以下步驟:

  • 創建XMLHttpRequest對象
  • 創建Ajax請求
  • 發送Ajax請求
  • 處理服務器響應

創建完XMLHttpRequest對象後就可 以開始使用它了。首先介紹open()方法,它創建一個請求,並準備向服務器發送,open方法語法如下:

open(method , url , asynchronous , user , password);

其中的參數含義如下:

  • method:指定請求的類型,一般為get或post;
  • url:指定請求的地址,可以使用絕對地址或相對地址,可以附帶查詢字符串
  • asynchronous:可選參數,標識請求是同步還是異步,異步請求為true,同步請求為false,默認情況下該參數為true;
  • user:可選參數,指定請求的用戶名,沒有則省略;
  • password:可選參數, 指定請求的密碼,沒有則省略;

示例:創建一個請求,利用get方式發送,服務器url為“my.do”

xmlhttp.open(“get”, “my.do”);

3.2 發送Ajax請求

在創建一個請求以後,可以使用send()方法向服務器發送這個請求,同時發送數據。其原型如下:

send(body);

該方法僅有一個body參數,它標識要向服務器發送的數據,其格式為查詢字符串的形式。

示例:

var body = “userName=qiyi&sex=male&age=25”;

xmlhttp.send(body);

3.3 捕獲請求的狀態變化

在發送請求後,往往無法知道請求什麽時候完成,所以必須利用事件機制捕獲請求的狀態,XMLHttpRequest對象提供了onreadystatechange事件實現這一功能。 onreadystatechange事件可以指定一個事件處理函數來處理XMLHttpRequest對象的執行結果。 在調用open方法與send方法時都會觸發onreadystatechange事件。

示例:

xmlhttp.onreadystatechange=function(){

//事件處理代碼

}

3.4 readyState狀態值

onreadystatechange事件是在readyState屬性方法改變時觸發,readyState的值表示了當前請求的狀態,在事件處理程序中可以根據這個值進行不同的處理,下表介紹了每個值的含義。

readyState

含義

0

表示對象已經建立,但還未初始化。

1

當調用open()方法後,readyState=1,表示XMLHttpRequest對象已經被初始化

2

當調用send()方法後,XHR在向服務器發送請求的這段時間內,readyState =2

3

當調用send()方法後,服務器成功接收到所有請求後,readyState = 3

4

表示已經成功接收到來自服務器的響應數據。

使用readyState屬性判斷請求狀態

在整個請求過程中,onreadystatechange事件在每一次readyState值發生改變時都會被觸發。通常在事件中判斷readyState的值是在請求完成時才做處理。

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readState ==4){

//對服務器響應數據進行處理

}

}

3.5 使用status屬性判斷請求的結果

status存儲服務器端返回的HTTP響應代碼,它代表請求的處理結果,下表列出了常見的響應代碼的含義:

Http狀態碼

含義

200

請求成功

202

請求被接收,但處理未完成

400

錯誤的請求

404

請求資源未找到

500

內部服務器錯誤

在請求已經完成的情況下,可以使用status判斷請求的結果,其中,404錯誤是最常見的錯誤代碼,代表“請求資源未找到”。在Ajax的開發中,最常用的是200這個響應代碼,例如在瀏覽器成功打開了一個網頁,這時HTTP相應代碼就是200,但這個代碼一般不會顯示。

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readState ==4){

if(xmlhttp.status ==200){

//請求成功完成

}

else{

//網絡失敗或者服務器錯誤

}

}

}

XHR對象可以接收服務器返回的文本片段和XML文檔,分別保存在responseText與responseXML屬性中。

3.6 獲得返回文本

1) 使用responseText獲得返回的文本

當服務器端處理了請求並返回後,可以利用XMLHttpRequest對象的responseText屬性獲取返回的文本片段。

//定義XMLHttpRequest對象的事件處理程序

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readyState==4){

if(xmlhttp.status==200){

//捕捉文本 alert(xmlhttp.responseText);

}else{

alert(xmlhttp.status);

}

}

}

2) 使用responseXML捕捉XML文檔

除responseText屬性外,還可以用responseXML屬性來獲取服務器返回的XML文檔。在使用responseText屬性獲取返回的純文本時,服務器端無需特殊的操作。

如果服務器返回的是XML文檔,必須要求響應體的HTTP頭信息中“content-type”屬性為“text/xml”。

假如服務器返回以下XML文檔

<?xml version="1.0" encoding="UTF-8">

<root>

<title>這是服務器返回的XML數據</title>

</root>

//將服務器返回的XML打印在屏幕上。

xmlhttp.onreadystatechange=function(){

if(xmlhttp.readyState==4){

if(xmlhttp.status==200){

//獲取xml對象

var xmlObj=xmlhttp.responseXML;

//獲取第一個title標記內容

var title=xmlObj.getElementsByTagName("title")[0].text;

//輸出信息

alert("XML:\n" + xmlObj.xml + "\n" + "第一個title標記內容為:" + title);

}else{

alert(xmlhttp.status);

}

}

}

初識Ajax