引言
要完整實現一個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對象時,最好將以上兩種方法都加上.如以下代碼所示:
<html> ???<head> ??????<title>創建xmlhttprequest對象</title> ??????<script language = "javascript" type = "text/javascript"> ??????<!-- ??????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對象 ??????} ????} ?????? --> ??????</script> ??????createxmlhttprequst();???//調用創建對象的方法 ????</head> <body> </body> </html>
"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 = "新數值"
有關表單對象的數據更新的示例如以下代碼所示:
<html> ??<head> ??<title>局部更新</title> ??<script language = "javascript" type = "text/javascript"> ??<!-- ??function changedata() ??{ ?????document.myform.mytext.value = "更新后的數據" ??} ??--> ??</head> ??<body> ?????<form name = "myform"> ?????<input type = "text" value = "原數據" name = "mytext"> ?????<input type = "button" value = "更新數據" onclick = "changedata()"> ?????</form> ???</body> </html>
⑵ie瀏覽器中標簽間文本的更新
在html代碼中,除了表單元素之外,還有很多其他的元素,這些元素的開始標簽與結束標簽之間往往也會有一點文字(如以下代碼所示),對這些文字的更新,也是局部更新的一部分。
<p>文字</p> 文字 <div>文字</div> <label>文字</label> <b>文字</b> <i>文字</i>
在ie瀏覽器中,innertext或innerhtml屬性可以用來更改標簽間文本的內容。其中innertext屬性用于更改開始標簽與結束標簽之間的純文本內容,而innerhtml屬性用于更改html內容。如以下代碼所示:
<html> <head> <title>局部更新</title> <script language = "javascript" type = "text/javascript"> ????<!-- ????function changedata() ????{ ???????mydiv.innertext = "更新后的數據"; ????} ????????????????????????????????? --> </script> </head> <body> ???<div id = "mydive">原數據</div> ???<input type = "button" value = "更新數據" onclick = "changedata()"> </body> </html>
⑶dom技術的局部刷新
innertext和innerhtml兩個屬性都是ie瀏覽器中的屬性,在netscape瀏覽器中并不支持該屬性。但無論是ie瀏覽器還是netscape瀏覽器,都支持dom。在dom中,可以修改標簽間的文本內容。
在dom中,將html文檔中的每一對開始標簽和結束標簽都看成是一個節點。例如html文檔中有一個標簽如下所示,那么該標簽在dom中稱之為一個“節點”。
<div id = "mydiv">原數據</div>
在dom中使用getelementbyid()方法可以通過id屬性值來查找該標簽(或者說是節點),如以下語句所示:
var node = document.getelementbyid("mydiv");
注意:在一個html文檔中,每個標簽中的id屬性值是不能重復的。因此,使用getelementbyid()方法獲得的節點是唯一的。
在dom中,認為開始標簽與結束標簽之間的文本是該節點的子節點,而firstchild屬性可以獲得一個節點下的第1個子節點。如以下代碼可以獲得<div>節點下的第1個子節點,也就是<div>標簽與</div>標簽之間的文字節點。
node.firstchild
注意,以上代碼獲得的是文字節點,而不是文字內容。如果要獲得節點的文字內容,則要使用節點的nodevalue屬性。通過設置nodevalue屬性值,可以改變文字節點的文本內容。完整的代碼如下所示:
<html> <head> <title>局部更新</title> <script language = "javascript" type = "text/javascript"> <!-- ??function changedata() ??{ ??//查找標簽(節點) ??var node = document.getelementbyid("mydiv"); ??//在dom中標簽中的文字被認為是標簽中的子節點 ??//節點的firstchild屬性為該節點下的第1個子節點 ??//nodevalue屬性為節點的值,也就是標簽中的文本值 ??node.firstchild.nodevalue = "更新后的數據"; ??} ??--> </script> </head> </html>
注意:目前主流的瀏覽器都支持dom技術的局部刷新。
7、完整的ajax實例
<html> <head> <title>ajax實例</title> <script language="javascript" type="text/javascript">???? ?????????<!-- ??????????var xmlhttprequest;??//定義一個變量用于存放xmlhttprequest對象 ??????????//定義一個用于創建xmlhttprequest對象的函數 ??????????function createxmlhttprequest() ??????????{ ??????????if(window.activexobject) ??????????{ ??????????//ie瀏覽器的創建方式 ??????????xmlhttprequest = new activexobject("microsoft.xmlhttp"); ?????????}else if(windew.xmlhttprequest) ?????????{ ?????????//netscape瀏覽器中的創建方式 ?????????xmlhttprequest = new xmlhttprequest(); ?????????} ?????????} ?????????//響應http請求狀態變化的函數 ?????????function httpstatechange() ?????????{ ?????????//判斷異步調用是否完成 ?????????if(xmlhttprequest.readystate == 4) ?????????{ ?????????//判斷異步調用是否成功,如果成功開始局部更新數據 ?????????if(xmlhttprequest.status == 200||xmlhttprequest.status == 0) ?????????{ ?????????//查找節點 ?????????var node = document.getelementbyid("mydiv"); ?????????//更新數據 ????????? node.firstchild.nodevalue = xmlhttprequest?.responsetext; ?????????} ?????????else ?????????{ ??????????//如果異步調用未成功,彈出警告框,并顯示出錯信息 ????????? alert("異步調用出錯/n返回的http狀態碼為:"+xmlhttprequest.status + "/n返回的http狀態信息為:" + xmlhttprequest.statustext); ????????} ?????? } ???????} ???????//異步調用服務器段數據 ?????? function getdata(name,value) ??????{??????????????????? ??????//創建xmlhttprequest對象 ??????createxmlhttprequest(); ??????if(xmlhttprequest!=null) ??????{ ??????//創建http請求 ??????xmlhttprequest.open("get","ajax.text",true) ??????//設置http請求狀態變化的函數 ??????xmlhttprequest.onreadystatechange = httpstatechange; ??????//發送請求 ??????xmlhttprequest.send(null); ??????} ???} ???--> ???</script> </head> <body> ???<div id="mydiv">原數據</div> ???<input type = "button" value = "更新數據" onclick = "getdata()"> </body> </html>
總結
到此這篇關于實現ajax異步調用和局部刷新的基本步驟的文章就介紹到這了,更多相關實現ajax的步驟內容請搜索碩編程以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持碩編程!