AJAX的基本步驟

要完整實現一個AJAX異步調用和局部刷新,通常需要以下幾個步驟:

(1)創建XMLHttpRequest對象,也就是創建一個異步調用對象.

(2)創建一個新的HTTP請求,并指定該HTTP請求的方法、URL及驗證信息.

(3)設置響應HTTP請求狀態變化的函數.

(4)發送HTTP請求.

(5)獲取異步調用返回的數據.

(6)使用JavaScript和DOM實現局部刷新

1、創建XMLHttpRequest對象

不同的瀏覽器使用的異步調用對象也有所不同,在IE瀏覽器中異步調用使用的是XMLHTTP組件中的XMLHttpRequest對象,而在Netscape、Firefox瀏覽器中則直接使用XMLHttpRequest組件。因此,在不同瀏覽器中創建XMLHttpRequest對象的方式都有所不同.

在IE瀏覽器中創建XMLHttpRequest對象的方式如下所示:

var xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");

在Netscape瀏覽器中創建XMLHttpRequest對象的方式如下所示:

var xmlHttpRequest = new XMLHttpRequest();

由于無法確定用戶使用的是什么瀏覽器,所以在創建XMLHttpRequest對象時,最好將以上兩種方法都加上.如以下代碼所示:

創建XMLHttpRequest對象


var xmlHttpRequest;//定義一個變量,用于存放XMLHttpRequest對象

function createXMLHttpRequest()//創建XMLHttpRequest對象的方法

{

if(window.ActiveXObject)//判斷是否是IE瀏覽器

{

xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");//創建IE瀏覽器中的XMLHttpRequest對象

}

else if(window.XMLHttpRequest)//判斷是否是Netscape等其他支持XMLHttpRequest組件的瀏覽器

{

xmlHttpRequest = new XMLHttpRequest();//創建其他瀏覽器上的XMLHttpRequest對象

}

}

-->

createXMLHttpRequst();//調用創建對象的方法

"if(window.ActiveXObject)"用來判斷是否使用IE瀏覽器.其中ActiveXOject并不是Windows對象的標準屬性,而是IE瀏覽器中專有的屬性,可以用于判斷瀏覽器是否支持ActiveX控件.通常只有IE瀏覽器或以IE瀏覽器為核心的瀏覽器才能支持Active控件.

"else if(window.XMLHttpRequest)"是為了防止一些瀏覽器既不支持ActiveX控件,也不支持XMLHttpRequest組件而進行的判斷.其中XMLHttpRequest也不是window對象的標準屬性,但可以用來判斷瀏覽器是否支持XMLHttpRequest組件.

如果瀏覽器既不支持ActiveX控件,也不支持XMLHttpRequest組件,那么就不會對xmlHttpRequest變量賦值

2、創建HTTP請求

創建了XMLHttpRequest對象之后,必須為XMLHttpRequest對象創建HTTP請求,用于說明XMLHttpRequest對象要從哪里獲取數據.通常可以是網站中的數據,也可以是本地中其他文件中的數據.

創建HTTP請求可以使用XMLHttpRequest對象的open()方法,其語法代碼如下所示:

XMLHttpRequest.open(method,URL,flag,name,password)

代碼中的參數解釋如下所示:

method:該參數用于指定HTTP的請求方法,一共有get、post、head、put、delete五種方法,常用的方法為get和post。

URL:該參數用于指定HTTP請求的URL地址,可以是絕對URL,也可以是相對URL。

flag:該參數為可選參數,參數值為布爾型。該參數用于指定是否使用異步方式。true表示異步方式、false表示同步方式,默認為true。

name:該參數為可選參數,用于輸入用戶名。如果服務器需要驗證,則必須使用該參數。

password:該參數為可選參數,用于輸入密碼。如果服務器需要驗證,則必須使用該參數。通常可以使用以下代碼來訪問一個網站文件的內容。

xmlHttpRequest.open("get","http://www.aspxfans.com/BookSupport/JavaScript/ajax.htm",true);

或者使用以下代碼來訪問一個本地文件內容:

xmlHttpRequest.open("get","ajax.htm",true);

注意:如果HTML文件放在Web服務器上,在Netscape瀏覽器中的JavaScript安全機制不允許與本機之外的主機進行通信。也就是說,使用open()方法只能打開與HTML文件在同一個服務器上的文件。而在IE瀏覽器中則無此限制(雖然可以打開其他服務器上的文件,但也會有警告提示)。

3、設置響應HTTP請求狀態變化的函數

創建完HTTP請求之后,應該就可以將HTTP請求發送給Web服務器了。然而,發送HTTP請求的目的是為了接收從服務器中返回的數據。從創建XMLHttpRequest對象開始,到發送數據、接收數據、XMLHttpRequest對象一共會經歷以下5中狀態。

⑴未初始化狀態。在創建完XMLHttpRequest對象時,該對象處于未初始化狀態,此時XMLHttpRequest對象的readyState屬性值為0。

⑵初始化狀態。在創建完XMLHttpRequest對象后使用open()方法創建了HTTP請求時,該對象處于初始化狀態。此時XMLHttpRequest對象的readyState屬性值為1。

⑶發送數據狀態。在初始化XMLHttpRequest對象后,使用send()方法發送數據時,該對象處于發送數據狀態,此時XMLHttpRequest對象的readyState屬性值為2。

⑷接收數據狀態。Web服務器接收完數據并進行處理完畢之后,向客戶端傳送返回的結果。此時,XMLHttpRequest對象處于接收數據狀態,XMLHttpRequest對象的readyState屬性值為3。

⑸完成狀態。XMLHttpRequest對象接收數據完畢后,進入完成狀態,此時XMLHttpRequest對象的readyState屬性值為4。此時接收完畢后的數據存入在客戶端計算機的內存中,可以使用responseText屬性或responseXml屬性來獲取數據。

只有在XMLHttpRequest對象完成了以上5個步驟之后,才可以獲取從服務器端返回的數據。因此,如果要獲得從服務器端返回的數據,就必須要先判斷XMLHttpRequest對象的狀態。

XMLHttpRequest對象可以響應readystatechange事件,該事件在XMLHttpRequest對象狀態改變時(也就是readyState屬性值改變時)激發。因此,可以通過該事件調用一個函數,并在該函數中判斷XMLHttpRequest對象的readyState屬性值。如果readyState屬性值為4則使用responseText屬性或responseXml屬性來獲取數據。具體代碼如下所示:

//設置當XMLHttpRequest對象狀態改變時調用的函數,注意函數名后面不要添加小括號

xmlHttpRequest.onreadystatechange = getData;

//定義函數

function getData()

{

//判斷XMLHttpRequest對象的readyState屬性值是否為4,如果為4表示異步調用完成

if(xmlHttpRequest.readyState == 4)

{

//設置獲取數據的語句

}

}

4、設置獲取服務器返回數據的語句

如果XMLHttpRequest對象的readyState屬性值等于4,表示異步調用過程完畢,就可以通過XMLHttpRequest對象的responseText屬性或responseXml屬性來獲取數據。

但是,異步調用過程完畢,并不代表異步調用成功了,如果要判斷異步調用是否成功,還要判斷XMLHttpRequest對象的status屬性值,只有該屬性值為200,才表示異步調用成功,因此,要獲取服務器返回數據的語句,還必須要先判斷XMLHttpRequest對象的status屬性值是否等于200,如以下代碼所示:

if(xmlHttpRequst.status == 200)

{

//使用以下語句將返回結果以字符串形式輸出

document.write(xmlHttpRequest.responseText);

//或者使用以下語句將返回結果以XML形式輸出

//document.write(xmlHttpRequest.responseXML);

}

注意:如果HTML文件不是在Web服務器上運行,而是在本地運行,則xmlHttpRequest.status的返回值為0。因此,如果該文件在本地運行,則應該加上xmlHttpRequest.status == 0的判斷。

通常將以上代碼放在響應HTTP請求狀態變化的函數體內,如以下代碼所示:

//設置當XMLHttpRequest對象狀態改變時調用的函數,注意函數名后面不要添加小括號

xmlHttpRequest.onreadystatechange = getData;

//定義函數

function getData()

{

//判斷XMLHttpRequest對象的readyState屬性值是否為4,如果為4表示異步調用完成

if(xmlHttpRequest.readyState==4)

{

//設置獲取數據的語句

if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 0)

{

//使用以下語句將返回結果以字符串形式輸出

document.write(xmlHttpRequest.responseText);

//或者使用以下語句將返回結果以XML形式輸出

//docunment.write(xmlHttpRequest.responseXML);

}

}

}

5、發送HTTP請求

在經過以上幾個步驟的設置之后,就可以將HTTP請求發送到Web服務器上去了。發送HTTP請求可以使用XMLHttpRequest對象的send()方法,其語法代碼如下所示:

XMLHttpRequest.send(data)

其中data是個可選參數,如果請求的數據不需要參數,即可以使用null來替代。data參數的格式與在URL中傳遞參數的格式類似,以下代碼為一個send()方法中的data參數的示例:

name=myName&value=myValue

只有在使用send()方法之后,XMLHttpRequest對象的readyState屬性值才會開始改變,也才會激發readystatechange事件,并調用函數。

6、局部更新

在通過Ajax的異步調用獲得服務器端數據之后,可以使用JavaScript或DOM來將網頁中的數據進行局部更新。常用的局部更新的方式有以下3種:

⑴表單對象的數據更新

表單對象的數據更新,通常只要更改表單對象的value屬性值,其語法代碼如下所示:

FormObject.value = "新數值"

有關表單對象的數據更新的示例如以下代碼所示:

⑵IE瀏覽器中標簽間文本的更新

在HTML代碼中,除了表單元素之外,還有很多其他的元素,這些元素的開始標簽與結束標簽之間往往也會有一點文字(如以下代碼所示),對這些文字的更新,也是局部更新的一部分。


在IE瀏覽器中,innerText或innerHTML屬性可以用來更改標簽間文本的內容。其中innerText屬性用于更改開始標簽與結束標簽之間的純文本內容,而innerHTML屬性用于更改HTML內容。如以下代碼所示:


⑶DOM技術的局部刷新

innerText和innerHTML兩個屬性都是IE瀏覽器中的屬性,在Netscape瀏覽器中并不支持該屬性。但無論是IE瀏覽器還是Netscape瀏覽器,都支持DOM。在DOM中,可以修改標簽間的文本內容。

在DOM中,將HTML文檔中的每一對開始標簽和結束標簽都看成是一個節點。例如HTML文檔中有一個標簽如下所示,那么該標簽在DOM中稱之為一個“節點”。

在DOM中使用getElementById()方法可以通過id屬性值來查找該標簽(或者說是節點),如以下語句所示:

var node = document.getElementById("myDiv");

注意:在一個HTML文檔中,每個標簽中的id屬性值是不能重復的。因此,使用getElementById()方法獲得的節點是唯一的。

在DOM中,認為開始標簽與結束標簽之間的文本是該節點的子節點,而firstChild屬性可以獲得一個節點下的第1個子節點。如以下代碼可以獲得

節點下的第1個子節點,也就是
標簽與
標簽之間的文字節點。

node.firstChild

注意,以上代碼獲得的是文字節點,而不是文字內容。如果要獲得節點的文字內容,則要使用節點的nodeValue屬性。通過設置nodeValue屬性值,可以改變文字節點的文本內容。完整的代碼如下所示:


7、完整的AJAX實例




最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容

  • 要完整實現一個AJAX異步調用和局部刷新,通常需要以下幾個步驟: (1)創建XMLHttpRequest對象,也就...
    紅鯉魚不理綠鯉魚閱讀 581評論 0 4
  • AJAX 原生js操作ajax 1.創建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,235評論 0 7
  • 寫在前面 本篇主要內容是結合“XMLHttpRequest Level 1”規范和w3school網站中針對XML...
    JSON_NULL閱讀 1,432評論 3 9
  • 《生命之旅》是至今我讀過最喜歡最好的一本書,雖然我只看了一小部分。 這本書的跟其他書一樣,有篇幅不長的“序”,可奇...
    Coco啫閱讀 336評論 0 1
  • 這大概是一年中最熱的一個月了吧?終于在月末迎來了臺風天,才換來些許涼快。 月初一個人因為工作去了趟上海,這是一個人...
    傻丫頭Lin閱讀 157評論 0 0