一篇文章弄清楚Ajax請(qǐng)求的五個(gè)步驟
一、定義
1、什么是Ajax
Ajax:即異步 JavaScript 和XML。Ajax是一種用于創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁(yè)的技術(shù)。通過(guò)在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換,Ajax可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新。而傳統(tǒng)的網(wǎng)頁(yè)(不使用 Ajax)如果需要更新內(nèi)容,必需重載整個(gè)網(wǎng)頁(yè)面。
2、同步與異步的區(qū)別
同步提交:當(dāng)用戶(hù)發(fā)送請(qǐng)求時(shí),當(dāng)前頁(yè)面不可以使用,服務(wù)器響應(yīng)頁(yè)面到客戶(hù)端,響應(yīng)完成,用戶(hù)才可以使用頁(yè)面。
異步提交:當(dāng)用戶(hù)發(fā)送請(qǐng)求時(shí),當(dāng)前頁(yè)面還可以繼續(xù)使用,當(dāng)異步請(qǐng)求的數(shù)據(jù)響應(yīng)給頁(yè)面,頁(yè)面把數(shù)據(jù)顯示出來(lái) 。
3、ajax的工作原理
客戶(hù)端發(fā)送請(qǐng)求,請(qǐng)求交給xhr,xhr把請(qǐng)求提交給服務(wù),服務(wù)器進(jìn)行業(yè)務(wù)處理,服務(wù)器響應(yīng)數(shù)據(jù)交給xhr對(duì)象,xhr對(duì)象接收數(shù)據(jù),由javascript把數(shù)據(jù)寫(xiě)到頁(yè)面上,如下圖所示:
二、實(shí)現(xiàn)AJAX的基本步驟
要完整實(shí)現(xiàn)一個(gè)AJAX異步調(diào)用和局部刷新,通常需要以下幾個(gè)步驟:
- 創(chuàng)建XMLHttpRequest對(duì)象,即創(chuàng)建一個(gè)異步調(diào)用對(duì)象.
- 創(chuàng)建一個(gè)新的HTTP請(qǐng)求,并指定該HTTP請(qǐng)求的方法、URL及驗(yàn)證信息.
- 設(shè)置響應(yīng)HTTP請(qǐng)求狀態(tài)變化的函數(shù).
- 發(fā)送HTTP請(qǐng)求.
- 獲取異步調(diào)用返回的數(shù)據(jù).
- 使用JavaScript和DOM實(shí)現(xiàn)局部刷新.
1、創(chuàng)建XMLHttpRequest對(duì)象
不同瀏覽器使用的異步調(diào)用對(duì)象有所不同,在IE瀏覽器中異步調(diào)用使用的是XMLHTTP組件中的XMLHttpRequest對(duì)象,而在Netscape、Firefox瀏覽器中則直接使用XMLHttpRequest組件。因此,在不同瀏覽器中創(chuàng)建XMLHttpRequest對(duì)象的方式都有所不同.
在IE瀏覽器中創(chuàng)建XMLHttpRequest對(duì)象的方式為:
var xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
在Netscape瀏覽器中創(chuàng)建XMLHttpRequest對(duì)象的方式為:
var xmlHttpRequest = new XMLHttpRequest();
由于無(wú)法確定用戶(hù)使用的是什么瀏覽器,所以在創(chuàng)建XMLHttpRequest對(duì)象時(shí),最好將以上兩種方法都加上.如以下代碼所示:
var xmlHttpRequest; //定義一個(gè)變量,用于存放XMLHttpRequest對(duì)象 createXMLHttpRequst(); //調(diào)用創(chuàng)建對(duì)象的方法 //創(chuàng)建XMLHttpRequest對(duì)象的方法 function createXMLHttpRequest(){ if(window.ActiveXObject) {//判斷是否是IE瀏覽器 xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");//創(chuàng)建IE的XMLHttpRequest對(duì)象 }else if(window.XMLHttpRequest){//判斷是否是Netscape等其他支持XMLHttpRequest組件的瀏覽器 xmlHttpRequest = new XMLHttpRequest();//創(chuàng)建其他瀏覽器上的XMLHttpRequest對(duì)象 } }
"if(window.ActiveXObject)"用來(lái)判斷是否使用IE瀏覽器.其中ActiveXOject并不是Windows對(duì)象的標(biāo)準(zhǔn)屬性,而是IE瀏覽器中專(zhuān)有的屬性,可以用于判斷瀏覽器是否支持ActiveX控件.通常只有IE瀏覽器或以IE瀏覽器為核心的瀏覽器才能支持Active控件.
"else if(window.XMLHttpRequest)"是為了防止一些瀏覽器既不支持ActiveX控件,也不支持XMLHttpRequest組件而進(jìn)行的判斷.其中XMLHttpRequest也不是window對(duì)象的標(biāo)準(zhǔn)屬性,但可以用來(lái)判斷瀏覽器是否支持XMLHttpRequest組件.
如果瀏覽器既不支持ActiveX控件,也不支持XMLHttpRequest組件,那么就不會(huì)對(duì)xmlHttpRequest變量賦值.
2、創(chuàng)建HTTP請(qǐng)求
創(chuàng)建了XMLHttpRequest對(duì)象之后,必須為XMLHttpRequest對(duì)象創(chuàng)建HTTP請(qǐng)求,用于說(shuō)明XMLHttpRequest對(duì)象要從哪里獲取數(shù)據(jù)。通??梢允蔷W(wǎng)站中的數(shù)據(jù),也可以是本地中其他文件中的數(shù)據(jù)。
創(chuàng)建HTTP請(qǐng)求可以使用XMLHttpRequest對(duì)象的open()方法,其語(yǔ)法代碼如下所示:
XMLHttpRequest.open(method,URL,flag,name,password);
代碼中的參數(shù)解釋如下所示:
- method:該參數(shù)用于指定HTTP的請(qǐng)求方法,一共有g(shù)et、post、head、put、delete五種方法,常用的方法為get和post。
- URL:該參數(shù)用于指定HTTP請(qǐng)求的URL地址,可以是絕對(duì)URL,也可以是相對(duì)URL。
- flag:該參數(shù)為可選,參數(shù)值為布爾型。該參數(shù)用于指定是否使用異步方式。true表示異步、false表示同步,默認(rèn)為true。
- name:該參數(shù)為可選參數(shù),用于輸入用戶(hù)名。如果服務(wù)器需要驗(yàn)證,則必須使用該參數(shù)。
- password:該參數(shù)為可選,用于輸入密碼。若服務(wù)器需要驗(yàn)證,則必須使用該參數(shù)。
通??梢允褂靡韵麓a來(lái)訪問(wèn)一個(gè)網(wǎng)站文件的內(nèi)容。
xmlHttpRequest.open("get","http://www.aspxfans.com/BookSupport/JavaScript/ajax.htm",true);
或者使用以下代碼來(lái)訪問(wèn)一個(gè)本地文件內(nèi)容:
xmlHttpRequest.open("get","ajax.htm",true);
注意:如果HTML文件放在Web服務(wù)器上,在Netscape瀏覽器中的JavaScript安全機(jī)制不允許與本機(jī)之外的主機(jī)進(jìn)行通信。也就是說(shuō),使用open()方法只能打開(kāi)與HTML文件在同一個(gè)服務(wù)器上的文件。而在IE瀏覽器中則無(wú)此限制(雖然可以打開(kāi)其他服務(wù)器上的文件,但也會(huì)有警告提示)。
3、設(shè)置響應(yīng)HTTP請(qǐng)求狀態(tài)變化的函數(shù)
創(chuàng)建完HTTP請(qǐng)求之后,應(yīng)該就可以將HTTP請(qǐng)求發(fā)送給Web服務(wù)器了。然而,發(fā)送HTTP請(qǐng)求的目的是為了接收從服務(wù)器中返回的數(shù)據(jù)。從創(chuàng)建XMLHttpRequest對(duì)象開(kāi)始,到發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、XMLHttpRequest對(duì)象一共會(huì)經(jīng)歷以下5中狀態(tài)。
- 未初始化狀態(tài)。在創(chuàng)建完XMLHttpRequest對(duì)象時(shí),該對(duì)象處于未初始化狀態(tài),此時(shí)XMLHttpRequest對(duì)象的readyState屬性值為0。
- 初始化狀態(tài)。在創(chuàng)建完XMLHttpRequest對(duì)象后使用open()方法創(chuàng)建了HTTP請(qǐng)求時(shí),該對(duì)象處于初始化狀態(tài)。此時(shí)XMLHttpRequest對(duì)象的readyState屬性值為1。
- 發(fā)送數(shù)據(jù)狀態(tài)。在初始化XMLHttpRequest對(duì)象后,使用send()方法發(fā)送數(shù)據(jù)時(shí),該對(duì)象處于發(fā)送數(shù)據(jù)狀態(tài),此時(shí)XMLHttpRequest對(duì)象的readyState屬性值為2。
- 接收數(shù)據(jù)狀態(tài)。Web服務(wù)器接收完數(shù)據(jù)并進(jìn)行處理完畢之后,向客戶(hù)端傳送返回的結(jié)果。此時(shí),XMLHttpRequest對(duì)象處于接收數(shù)據(jù)狀態(tài),XMLHttpRequest對(duì)象的readyState屬性值為3。
- 完成狀態(tài)。XMLHttpRequest對(duì)象接收數(shù)據(jù)完畢后,進(jìn)入完成狀態(tài),此時(shí)XMLHttpRequest對(duì)象的readyState屬性值為4。此時(shí)接收完畢后的數(shù)據(jù)存入在客戶(hù)端計(jì)算機(jī)的內(nèi)存中,可以使用responseText屬性或responseXml屬性來(lái)獲取數(shù)據(jù)。
只有在XMLHttpRequest對(duì)象完成了以上5個(gè)步驟之后,才可以獲取從服務(wù)器端返回的數(shù)據(jù)。因此,如果要獲得從服務(wù)器端返回的數(shù)據(jù),就必須要先判斷XMLHttpRequest對(duì)象的狀態(tài)。
XMLHttpRequest對(duì)象可以響應(yīng)readystatechange事件,該事件在XMLHttpRequest對(duì)象狀態(tài)改變時(shí)(也就是readyState屬性值改變時(shí))激發(fā)。因此,可以通過(guò)該事件調(diào)用一個(gè)函數(shù),并在該函數(shù)中判斷XMLHttpRequest對(duì)象的readyState屬性值。如果readyState屬性值為4則使用responseText屬性或responseXml屬性來(lái)獲取數(shù)據(jù)。具體代碼如下所示:
//設(shè)置當(dāng)XMLHttpRequest對(duì)象狀態(tài)改變時(shí)調(diào)用的函數(shù),注意函數(shù)名后面不要添加小括號(hào) xmlHttpRequest.onreadystatechange = getData; //定義函數(shù) function getData(){ //判斷XMLHttpRequest對(duì)象的readyState屬性值是否為4,如果為4表示異步調(diào)用完成 if(xmlHttpRequest.readyState == 4) { //設(shè)置獲取數(shù)據(jù)的語(yǔ)句 } }
4、設(shè)置獲取服務(wù)器返回?cái)?shù)據(jù)的語(yǔ)句
如果XMLHttpRequest對(duì)象的readyState屬性值等于4,表示異步調(diào)用過(guò)程完畢,就可以通過(guò)XMLHttpRequest對(duì)象的responseText屬性或responseXml屬性來(lái)獲取數(shù)據(jù)。
但是,異步調(diào)用過(guò)程完畢,并不代表異步調(diào)用成功了,如果要判斷異步調(diào)用是否成功,還要判斷XMLHttpRequest對(duì)象的status屬性值,只有該屬性值為200,才表示異步調(diào)用成功,因此,要獲取服務(wù)器返回?cái)?shù)據(jù)的語(yǔ)句,還必須要先判斷XMLHttpRequest對(duì)象的status屬性值是否等于200,如以下代碼所示:
if(xmlHttpRequst.status == 200) { document.write(xmlHttpRequest.responseText);//將返回結(jié)果以字符串形式輸出 //document.write(xmlHttpRequest.responseXML);//或者將返回結(jié)果以XML形式輸出 }
注意:如果HTML文件不是在Web服務(wù)器上運(yùn)行,而是在本地運(yùn)行,則xmlHttpRequest.status的返回值為0。因此,如果該文件在本地運(yùn)行,則應(yīng)該加上x(chóng)mlHttpRequest.status == 0的判斷。
通常將以上代碼放在響應(yīng)HTTP請(qǐng)求狀態(tài)變化的函數(shù)體內(nèi),如以下代碼所示:
//設(shè)置當(dāng)XMLHttpRequest對(duì)象狀態(tài)改變時(shí)調(diào)用的函數(shù),注意函數(shù)名后面不要添加小括號(hào) xmlHttpRequest.onreadystatechange = getData; //定義函數(shù) function getData(){ //判斷XMLHttpRequest對(duì)象的readyState屬性值是否為4,如果為4表示異步調(diào)用完成 if(xmlHttpRequest.readyState==4){ if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 0){//設(shè)置獲取數(shù)據(jù)的語(yǔ)句 document.write(xmlHttpRequest.responseText);//將返回結(jié)果以字符串形式輸出 //docunment.write(xmlHttpRequest.responseXML);//或者將返回結(jié)果以XML形式輸出 } } }
5、發(fā)送HTTP請(qǐng)求
在經(jīng)過(guò)以上幾個(gè)步驟的設(shè)置之后,就可以將HTTP請(qǐng)求發(fā)送到Web服務(wù)器上去了。發(fā)送HTTP請(qǐng)求可以使用XMLHttpRequest對(duì)象的send()方法,其語(yǔ)法代碼如下所示:
XMLHttpRequest.send(data);
其中data是個(gè)可選參數(shù),如果請(qǐng)求的數(shù)據(jù)不需要參數(shù),即可以使用null來(lái)替代。data參數(shù)的格式與在URL中傳遞參數(shù)的格式類(lèi)似,以下代碼為一個(gè)send()方法中的data參數(shù)的示例:
name=myName&value=myValue
只有在使用send()方法之后,XMLHttpRequest對(duì)象的readyState屬性值才會(huì)開(kāi)始改變,也才會(huì)激發(fā)readystatechange事件,并調(diào)用函數(shù)。
6、局部更新
在通過(guò)Ajax的異步調(diào)用獲得服務(wù)器端數(shù)據(jù)之后,可以使用JavaScript或DOM來(lái)將網(wǎng)頁(yè)中的數(shù)據(jù)進(jìn)行局部更新。
三、完整的AJAX實(shí)例
<html> <head> <title>AJAX實(shí)例</title> <script language="javascript" type="text/javascript"> function ajaxHttpRequestFunc(){ let xmlHttpRequest; // 創(chuàng)建XMLHttpRequest對(duì)象,即一個(gè)用于保存異步調(diào)用對(duì)象的變量 if(window.ActiveXObject){ // IE瀏覽器的創(chuàng)建方式 xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP"); }else if(window.XMLHttpRequest){ // Netscape瀏覽器中的創(chuàng)建方式 xmlHttpRequest = new XMLHttpRequest(); } xmlHttpRequest.onreadystatechange=function(){ // 設(shè)置響應(yīng)http請(qǐng)求狀態(tài)變化的事件 console.log('請(qǐng)求過(guò)程', xmlHttpRequest.readyState); if(xmlHttpRequest.readyState == 4){ // 判斷異步調(diào)用是否成功,若成功開(kāi)始局部更新數(shù)據(jù) console.log('狀態(tài)碼為', xmlHttpRequest.status); if(xmlHttpRequest.status == 200) { console.log('異步調(diào)用返回的數(shù)據(jù)為:', xmlHttpRequest .responseText); document.getElementById("myDiv").innerHTML = xmlHttpRequest .responseText; // 局部刷新數(shù)據(jù)到頁(yè)面 } else { // 如果異步調(diào)用未成功,彈出警告框,并顯示錯(cuò)誤狀態(tài)碼 alert("error:HTTP狀態(tài)碼為:"+xmlHttpRequest.status); } } } xmlHttpRequest.open("GET","https://www.runoob.com/try/ajax/ajax_info.txt",true); // 創(chuàng)建http請(qǐng)求,并指定請(qǐng)求得方法(get)、url(https://www.runoob.com/try/ajax/ajax_info.txt)以及驗(yàn)證信息 xmlHttpRequest.send(null); // 發(fā)送請(qǐng)求 } </script> </head> <body> <div id="myDiv">原數(shù)據(jù)</div> <input type = "button" value = "更新數(shù)據(jù)" onclick = "ajaxHttpRequestFunc()"> </body> </html>
直接運(yùn)行該段代碼可能會(huì)出現(xiàn)跨域的現(xiàn)象,控制臺(tái)的報(bào)錯(cuò)信息如下:
這是因?yàn)榇a中設(shè)置請(qǐng)求的是菜鳥(niǎo)驛站服務(wù)端的文件,所以出現(xiàn)跨域?qū)е挛凑+@取到服務(wù)端返回的數(shù)據(jù)。
解決辦法:復(fù)制該段代碼在菜鳥(niǎo)驛站的編輯器中粘貼運(yùn)行即可。
點(diǎn)擊運(yùn)行前頁(yè)面顯示為:
點(diǎn)擊運(yùn)行后頁(yè)面顯示為:
好啦,關(guān)于ajax的部分到此就全部學(xué)習(xí)完成了,給自己點(diǎn)一個(gè)大大的贊吧!
參考文獻(xiàn):
【1】https://qqe2.com/java/post/28.html
總結(jié)
到此這篇關(guān)于Ajax請(qǐng)求五個(gè)步驟的文章就介紹到這了,更多相關(guān)Ajax請(qǐng)求步驟內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Ajax實(shí)現(xiàn)進(jìn)度條的繪制
這篇文章主要介紹了如何利用Ajax繪制進(jìn)度條,文中的示例代碼講解詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,感興趣的小伙伴可以了解一下2022-04-04基于Ajax+div的“左邊菜單、右邊內(nèi)容”頁(yè)面效果實(shí)現(xiàn)
這篇文章主要介紹了基于Ajax+div的“左邊菜單、右邊內(nèi)容”頁(yè)面效果實(shí)現(xiàn) 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07使用Ajax實(shí)時(shí)檢測(cè)"用戶(hù)名、郵箱等"是否已經(jīng)存在
這篇文章主要介紹了使用Ajax實(shí)時(shí)檢測(cè)"用戶(hù)名、郵箱等"是否已經(jīng)存在,需要的朋友可以參考下2015-01-01ajax的get請(qǐng)求時(shí)緩存處理解決方法
這篇文章主要介紹了ajax的get請(qǐng)求時(shí)緩存處理解決方法,詳細(xì)分析了常見(jiàn)的四種解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02jquery通過(guò)AJAX從后臺(tái)獲取信息并顯示在表格上的實(shí)現(xiàn)類(lèi)
今天小編抽給時(shí)間把jquery通過(guò)AJAX從后臺(tái)獲取信息并顯示在表格上的實(shí)現(xiàn)類(lèi),單獨(dú)寫(xiě)出來(lái),這樣程序員,不需要每次寫(xiě)代碼了,可以節(jié)省大量的時(shí)間,感興趣的朋友一起來(lái)看看吧2015-09-09那些年,我還在學(xué)習(xí)Ajax 學(xué)習(xí)筆記
Ajax不用說(shuō),每個(gè)做web開(kāi)發(fā)的同志都知道,因?yàn)樗菍W(xué)習(xí)web開(kāi)發(fā)必經(jīng)之路,不管你是做asp.net,還是javaWeb,還是PHP2012-03-03ajax實(shí)時(shí)任務(wù)提示功能的實(shí)現(xiàn)代碼
本項(xiàng)目運(yùn)用了 FLEAPHP,MYSQL,SMARTY,FCKEDItor,JSON,PROTOTYPE的技術(shù),在這里首先要感謝這些開(kāi)源項(xiàng)目的開(kāi)發(fā)者給我們帶來(lái)的好東西,其次要感謝[生氣豬--讓我?guī)退鲆粋€(gè)這樣的小東西來(lái)提醒她按時(shí)完成事情].花了一個(gè)3個(gè)小時(shí)完成.希望給大家起到拋磚引玉的作用啊....2008-09-09ajax實(shí)現(xiàn)城市三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了ajax實(shí)現(xiàn)城市三級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10