AJAX的基本步驟

要完整實(shí)現(xiàn)一個AJAX異步調(diào)用和局部刷新,通常需要以下幾個步驟:

(1)創(chuàng)建XMLHttpRequest對象,也就是創(chuàng)建一個異步調(diào)用對象.

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

(3)設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù).

(4)發(fā)送HTTP請求.

(5)獲取異步調(diào)用返回的數(shù)據(jù).

(6)使用JavaScript和DOM實(shí)現(xiàn)局部刷新

1、創(chuàng)建XMLHttpRequest對象

不同的瀏覽器使用的異步調(diào)用對象也有所不同,在IE瀏覽器中異步調(diào)用使用的是XMLHTTP組件中的XMLHttpRequest對象,而在Netscape蹋凝、Firefox瀏覽器中則直接使用XMLHttpRequest組件沧踏。因此,在不同瀏覽器中創(chuàng)建XMLHttpRequest對象的方式都有所不同.

在IE瀏覽器中創(chuàng)建XMLHttpRequest對象的方式如下所示:

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

在Netscape瀏覽器中創(chuàng)建XMLHttpRequest對象的方式如下所示:

var xmlHttpRequest = new XMLHttpRequest();

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

創(chuàng)建XMLHttpRequest對象


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

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

{

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

{

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

}

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

{

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

}

}

-->

createXMLHttpRequst();//調(diào)用創(chuàng)建對象的方法

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

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

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

2、創(chuàng)建HTTP請求

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

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

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

代碼中的參數(shù)解釋如下所示:

method:該參數(shù)用于指定HTTP的請求方法,一共有g(shù)et、post谢谦、head释牺、put、delete五種方法回挽,常用的方法為get和post没咙。

URL:該參數(shù)用于指定HTTP請求的URL地址,可以是絕對URL千劈,也可以是相對URL祭刚。

flag:該參數(shù)為可選參數(shù),參數(shù)值為布爾型墙牌。該參數(shù)用于指定是否使用異步方式涡驮。true表示異步方式、false表示同步方式喜滨,默認(rèn)為true捉捅。

name:該參數(shù)為可選參數(shù),用于輸入用戶名虽风。如果服務(wù)器需要驗(yàn)證棒口,則必須使用該參數(shù)。

password:該參數(shù)為可選參數(shù)辜膝,用于輸入密碼无牵。如果服務(wù)器需要驗(yàn)證,則必須使用該參數(shù)厂抖。通尘セ伲可以使用以下代碼來訪問一個網(wǎng)站文件的內(nèi)容。

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

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

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

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

3垒在、設(shè)置響應(yīng)HTTP請求狀態(tài)變化的函數(shù)

創(chuàng)建完HTTP請求之后,應(yīng)該就可以將HTTP請求發(fā)送給Web服務(wù)器了扔亥。然而场躯,發(fā)送HTTP請求的目的是為了接收從服務(wù)器中返回的數(shù)據(jù)。從創(chuàng)建XMLHttpRequest對象開始旅挤,到發(fā)送數(shù)據(jù)踢关、接收數(shù)據(jù)、XMLHttpRequest對象一共會經(jīng)歷以下5中狀態(tài)粘茄。

⑴未初始化狀態(tài)签舞。在創(chuàng)建完XMLHttpRequest對象時秕脓,該對象處于未初始化狀態(tài),此時XMLHttpRequest對象的readyState屬性值為0儒搭。

⑵初始化狀態(tài)吠架。在創(chuàng)建完XMLHttpRequest對象后使用open()方法創(chuàng)建了HTTP請求時,該對象處于初始化狀態(tài)搂鲫。此時XMLHttpRequest對象的readyState屬性值為1傍药。

⑶發(fā)送數(shù)據(jù)狀態(tài)。在初始化XMLHttpRequest對象后魂仍,使用send()方法發(fā)送數(shù)據(jù)時拐辽,該對象處于發(fā)送數(shù)據(jù)狀態(tài),此時XMLHttpRequest對象的readyState屬性值為2擦酌。

⑷接收數(shù)據(jù)狀態(tài)俱诸。Web服務(wù)器接收完數(shù)據(jù)并進(jìn)行處理完畢之后,向客戶端傳送返回的結(jié)果仑氛。此時乙埃,XMLHttpRequest對象處于接收數(shù)據(jù)狀態(tài),XMLHttpRequest對象的readyState屬性值為3锯岖。

⑸完成狀態(tài)介袜。XMLHttpRequest對象接收數(shù)據(jù)完畢后,進(jìn)入完成狀態(tài)出吹,此時XMLHttpRequest對象的readyState屬性值為4遇伞。此時接收完畢后的數(shù)據(jù)存入在客戶端計(jì)算機(jī)的內(nèi)存中,可以使用responseText屬性或responseXml屬性來獲取數(shù)據(jù)捶牢。

只有在XMLHttpRequest對象完成了以上5個步驟之后鸠珠,才可以獲取從服務(wù)器端返回的數(shù)據(jù)。因此秋麸,如果要獲得從服務(wù)器端返回的數(shù)據(jù)渐排,就必須要先判斷XMLHttpRequest對象的狀態(tài)。

XMLHttpRequest對象可以響應(yīng)readystatechange事件灸蟆,該事件在XMLHttpRequest對象狀態(tài)改變時(也就是readyState屬性值改變時)激發(fā)驯耻。因此,可以通過該事件調(diào)用一個函數(shù)炒考,并在該函數(shù)中判斷XMLHttpRequest對象的readyState屬性值可缚。如果readyState屬性值為4則使用responseText屬性或responseXml屬性來獲取數(shù)據(jù)。具體代碼如下所示:

//設(shè)置當(dāng)XMLHttpRequest對象狀態(tài)改變時調(diào)用的函數(shù)斋枢,注意函數(shù)名后面不要添加小括號

xmlHttpRequest.onreadystatechange = getData;

//定義函數(shù)

function getData()

{

//判斷XMLHttpRequest對象的readyState屬性值是否為4帘靡,如果為4表示異步調(diào)用完成

if(xmlHttpRequest.readyState == 4)

{

//設(shè)置獲取數(shù)據(jù)的語句

}

}

4、設(shè)置獲取服務(wù)器返回數(shù)據(jù)的語句

如果XMLHttpRequest對象的readyState屬性值等于4瓤帚,表示異步調(diào)用過程完畢描姚,就可以通過XMLHttpRequest對象的responseText屬性或responseXml屬性來獲取數(shù)據(jù)涩赢。

但是,異步調(diào)用過程完畢轩勘,并不代表異步調(diào)用成功了谒主,如果要判斷異步調(diào)用是否成功,還要判斷XMLHttpRequest對象的status屬性值赃阀,只有該屬性值為200霎肯,才表示異步調(diào)用成功,因此榛斯,要獲取服務(wù)器返回數(shù)據(jù)的語句观游,還必須要先判斷XMLHttpRequest對象的status屬性值是否等于200,如以下代碼所示:

if(xmlHttpRequst.status == 200)

{

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

document.write(xmlHttpRequest.responseText);

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

//document.write(xmlHttpRequest.responseXML);

}

注意:如果HTML文件不是在Web服務(wù)器上運(yùn)行驮俗,而是在本地運(yùn)行懂缕,則xmlHttpRequest.status的返回值為0。因此王凑,如果該文件在本地運(yùn)行搪柑,則應(yīng)該加上xmlHttpRequest.status == 0的判斷。

通常將以上代碼放在響應(yīng)HTTP請求狀態(tài)變化的函數(shù)體內(nèi)索烹,如以下代碼所示:

//設(shè)置當(dāng)XMLHttpRequest對象狀態(tài)改變時調(diào)用的函數(shù)工碾,注意函數(shù)名后面不要添加小括號

xmlHttpRequest.onreadystatechange = getData;

//定義函數(shù)

function getData()

{

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

if(xmlHttpRequest.readyState==4)

{

//設(shè)置獲取數(shù)據(jù)的語句

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

{

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

document.write(xmlHttpRequest.responseText);

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

//docunment.write(xmlHttpRequest.responseXML);

}

}

}

5百姓、發(fā)送HTTP請求

在經(jīng)過以上幾個步驟的設(shè)置之后渊额,就可以將HTTP請求發(fā)送到Web服務(wù)器上去了。發(fā)送HTTP請求可以使用XMLHttpRequest對象的send()方法垒拢,其語法代碼如下所示:

XMLHttpRequest.send(data)

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

name=myName&value=myValue

只有在使用send()方法之后,XMLHttpRequest對象的readyState屬性值才會開始改變尸疆,也才會激發(fā)readystatechange事件椿猎,并調(diào)用函數(shù)。

6仓技、局部更新

在通過Ajax的異步調(diào)用獲得服務(wù)器端數(shù)據(jù)之后鸵贬,可以使用JavaScript或DOM來將網(wǎng)頁中的數(shù)據(jù)進(jìn)行局部更新俗他。常用的局部更新的方式有以下3種:

⑴表單對象的數(shù)據(jù)更新

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

FormObject.value = "新數(shù)值"

有關(guān)表單對象的數(shù)據(jù)更新的示例如以下代碼所示:

⑵IE瀏覽器中標(biāo)簽間文本的更新

在HTML代碼中兆衅,除了表單元素之外地沮,還有很多其他的元素嗜浮,這些元素的開始標(biāo)簽與結(jié)束標(biāo)簽之間往往也會有一點(diǎn)文字(如以下代碼所示),對這些文字的更新摩疑,也是局部更新的一部分危融。


在IE瀏覽器中,innerText或innerHTML屬性可以用來更改標(biāo)簽間文本的內(nèi)容雷袋。其中innerText屬性用于更改開始標(biāo)簽與結(jié)束標(biāo)簽之間的純文本內(nèi)容吉殃,而innerHTML屬性用于更改HTML內(nèi)容。如以下代碼所示:


⑶DOM技術(shù)的局部刷新

innerText和innerHTML兩個屬性都是IE瀏覽器中的屬性昆稿,在Netscape瀏覽器中并不支持該屬性廉沮。但無論是IE瀏覽器還是Netscape瀏覽器叠艳,都支持DOM。在DOM中抱完,可以修改標(biāo)簽間的文本內(nèi)容。

在DOM中刃泡,將HTML文檔中的每一對開始標(biāo)簽和結(jié)束標(biāo)簽都看成是一個節(jié)點(diǎn)巧娱。例如HTML文檔中有一個標(biāo)簽如下所示,那么該標(biāo)簽在DOM中稱之為一個“節(jié)點(diǎn)”烘贴。

在DOM中使用getElementById()方法可以通過id屬性值來查找該標(biāo)簽(或者說是節(jié)點(diǎn))禁添,如以下語句所示:

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

注意:在一個HTML文檔中,每個標(biāo)簽中的id屬性值是不能重復(fù)的桨踪。因此上荡,使用getElementById()方法獲得的節(jié)點(diǎn)是唯一的。

在DOM中馒闷,認(rèn)為開始標(biāo)簽與結(jié)束標(biāo)簽之間的文本是該節(jié)點(diǎn)的子節(jié)點(diǎn)酪捡,而firstChild屬性可以獲得一個節(jié)點(diǎn)下的第1個子節(jié)點(diǎn)。如以下代碼可以獲得

節(jié)點(diǎn)下的第1個子節(jié)點(diǎn)纳账,也就是
標(biāo)簽與
標(biāo)簽之間的文字節(jié)點(diǎn)逛薇。

node.firstChild

注意,以上代碼獲得的是文字節(jié)點(diǎn)疏虫,而不是文字內(nèi)容永罚。如果要獲得節(jié)點(diǎn)的文字內(nèi)容,則要使用節(jié)點(diǎn)的nodeValue屬性卧秘。通過設(shè)置nodeValue屬性值呢袱,可以改變文字節(jié)點(diǎn)的文本內(nèi)容。完整的代碼如下所示:


7翅敌、完整的AJAX實(shí)例




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羞福,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚯涮,更是在濱河造成了極大的恐慌治专,老刑警劉巖卖陵,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異张峰,居然都是意外死亡泪蔫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門喘批,熙熙樓的掌柜王于貴愁眉苦臉地迎上來撩荣,“玉大人,你說我怎么就攤上這事饶深⌒鲎遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵粥喜,是天一觀的道長凸主。 經(jīng)常有香客問我,道長额湘,這世上最難降的妖魔是什么卿吐? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锋华,結(jié)果婚禮上嗡官,老公的妹妹穿的比我還像新娘。我一直安慰自己毯焕,他們只是感情好衍腥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纳猫,像睡著了一般婆咸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芜辕,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天尚骄,我揣著相機(jī)與錄音,去河邊找鬼侵续。 笑死倔丈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的状蜗。 我是一名探鬼主播需五,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轧坎!你這毒婦竟也來了宏邮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜀铲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體属百,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡记劝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了族扰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厌丑。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渔呵,靈堂內(nèi)的尸體忽然破棺而出怒竿,到底是詐尸還是另有隱情,我是刑警寧澤扩氢,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布耕驰,位于F島的核電站,受9級特大地震影響录豺,放射性物質(zhì)發(fā)生泄漏朦肘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一双饥、第九天 我趴在偏房一處隱蔽的房頂上張望媒抠。 院中可真熱鬧,春花似錦咏花、人聲如沸趴生。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍匆。三九已至,卻和暖如春棚菊,著一層夾襖步出監(jiān)牢的瞬間锉桑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工窍株, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留民轴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓球订,卻偏偏與公主長得像后裸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冒滩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 要完整實(shí)現(xiàn)一個AJAX異步調(diào)用和局部刷新,通常需要以下幾個步驟: (1)創(chuàng)建XMLHttpRequest對象,也就...
    紅鯉魚不理綠鯉魚閱讀 580評論 0 4
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,201評論 0 7
  • 寫在前面 本篇主要內(nèi)容是結(jié)合“XMLHttpRequest Level 1”規(guī)范和w3school網(wǎng)站中針對XML...
    JSON_NULL閱讀 1,416評論 3 9
  • 《生命之旅》是至今我讀過最喜歡最好的一本書微驶,雖然我只看了一小部分。 這本書的跟其他書一樣,有篇幅不長的“序”因苹,可奇...
    Coco啫閱讀 330評論 0 1
  • 這大概是一年中最熱的一個月了吧苟耻?終于在月末迎來了臺風(fēng)天,才換來些許涼快扶檐。 月初一個人因?yàn)楣ぷ魅チ颂松虾P渍龋@是一個人...
    傻丫頭Lin閱讀 150評論 0 0