Ajax使用学习
本文轉(zhuǎn)載自:http://www.jianshu.com/p/ff9e1139ea51
一、簡(jiǎn)介
1.ajax是Asynchronous Javascript and XML的縮寫,意思是執(zhí)行異步的網(wǎng)絡(luò)請(qǐng)求
2.我們會(huì)發(fā)現(xiàn)使用form表單submit按鈕提交表單的時(shí)候,網(wǎng)頁會(huì)有執(zhí)行刷新操作,在新頁面告知操作結(jié)果,而ajax技術(shù)可以使得向服務(wù)器請(qǐng)求數(shù)據(jù)的時(shí)候無需卸載頁面,得到更好的體驗(yàn)。
3.ajax的核心是XMLHttpRequest對(duì)象,它實(shí)現(xiàn)了異步方式從服務(wù)器獲取數(shù)據(jù),也就是用XHR對(duì)象獲取到服務(wù)器的數(shù)據(jù),再使用DOM將數(shù)據(jù)更新到頁面中。
4.雖然ajax名字中包含了XML,但是他只是一種通信手段,與具體數(shù)據(jù)格式?jīng)]有關(guān)系,因?yàn)楫?dāng)時(shí)主流使用XML作為前后臺(tái)通信數(shù)據(jù)的格式,所以名字中使用了XML;而現(xiàn)在主要使用的都是JSON格式的字符串
二、XMLHttpRequest對(duì)象
ajax的實(shí)現(xiàn)流程如下:
1.創(chuàng)建XHR對(duì)象
2.調(diào)用open()方法,創(chuàng)建請(qǐng)求
3.調(diào)用send()方法,發(fā)送請(qǐng)求
4.捕獲請(qǐng)求狀態(tài),判斷請(qǐng)求結(jié)果
5.獲取數(shù)據(jù)庫返回的數(shù)據(jù)
1.創(chuàng)建XHR對(duì)象
XHR對(duì)象首次實(shí)現(xiàn)是在ie5上,當(dāng)時(shí)使用的是ActiveX對(duì)象,所以XHR下ie上有兩個(gè)版本的實(shí)現(xiàn)方式,ie7以下的ActiveX對(duì)象與ie7以上的XHR對(duì)象,其余瀏覽器統(tǒng)一都是使用的XHR對(duì)象。
所以創(chuàng)建對(duì)象的時(shí)候需要有兼容性寫法
if(window.XMLHttpRequest){var request = new XMLHttpRequest(); }else{//這是ie7以下的寫法var request = new ActiveXObject("Microsoft.XMLHttp"); }2.調(diào)用open()方法
request.open(method,url,boolean);open()方法接收3個(gè)參數(shù):
- method:數(shù)據(jù)提交方式,字符串形式,可以使用“get”或“post”
- url:請(qǐng)求對(duì)象地址,字符串表示(get方式與post方式有差異)
- boolean:true(默認(rèn))表示異步請(qǐng)求,false表示同步請(qǐng)求(相信使用ajax都是為了異步的,所以這里就用true,或者不填寫)
get方式請(qǐng)求:
使用get方式提交數(shù)據(jù)時(shí)需要將提交內(nèi)容以固定的格式附加在URL后面,格式如下:
post方式請(qǐng)求:
使用post方式提交數(shù)據(jù),提交內(nèi)容是作為send()方法的參數(shù)提交的,所以URL后面無需附加參數(shù)。
注意:因?yàn)橐呀?jīng)不再使用form表單,所以后臺(tái)無法再使用name屬性獲取數(shù)據(jù),之前定義在form表單name屬性中的內(nèi)容現(xiàn)在就是在name1=value1中的name1中,相應(yīng)的,post方式就是下文中的postbody中的name1。
3.調(diào)用send()方法
request.send(postbody);send()方法接收1個(gè)參數(shù):
- postbody:字符串形式,填入需要提交的數(shù)據(jù);如果沒有提交的書,可以填入null
get方式請(qǐng)求:
因?yàn)間et方式下的數(shù)據(jù)已經(jīng)附加在URL后面提交,所以這里一般填入null
post方式請(qǐng)求:
數(shù)據(jù)的格式如下:
注意1:此處用post方式提交數(shù)據(jù)與用form表單提交畢竟有所不同,服務(wù)器會(huì)需要程序來讀取并解析原始數(shù)據(jù),所以我們需要使用XHR來模仿表單提交:
//將Content的頭部信息重新設(shè)置 //定義表單提交時(shí)的內(nèi)容類型,并以適當(dāng)類型創(chuàng)建一個(gè)字符串 request.setRequestHeader("Content-Type","application/x-www/form-unencoded");注意2:這個(gè)方法只能加載open()方法之后,send()方法之前。
//實(shí)際使用方法 var username = document.getElementById("username"); var passwd = document.getElementById("passwd");var url = "php/post.php"; request.open("post",url,true);//放置的位置一定在這里 request.setRequestHeader("Content-Type","application/x-www/form-unencoded");var postbody = "username="+username.value+"&passwd="+passwd.value; request.send(postbody);4.捕獲請(qǐng)求狀態(tài),判斷結(jié)果
send()方法調(diào)用后,請(qǐng)求就會(huì)被提交到服務(wù)器;多數(shù)情況下,我們會(huì)發(fā)送異步請(qǐng)求先檢查請(qǐng)求過程當(dāng)前的活動(dòng)階段,再判斷請(qǐng)求是否返回成功。
XHR對(duì)象相關(guān)屬性:
- readyState:請(qǐng)求/響應(yīng)過程的當(dāng)前活動(dòng)階段
- responseText:作為響應(yīng)主體被返回的文本
- responseXML:如果響應(yīng)的內(nèi)容類型是text/xml或者application這個(gè)屬性中將保存著響應(yīng)數(shù)據(jù)的XMLDOM文檔
- status:響應(yīng)的HTTP狀態(tài)
- statusText:Http狀態(tài)說明
我們利用原生的onreadystatechange事件來監(jiān)聽readyState變化。
readyState返回值如下:
只要readyState的值有一個(gè)值變?yōu)榱硪粋€(gè)值,就會(huì)觸發(fā)一次onreadystatechange事件,可以利用此事件來返回監(jiān)聽到的請(qǐng)求/響應(yīng)過程狀態(tài)值。
我們關(guān)心的是readyState值為4的情況,因?yàn)檫@是代表所有數(shù)據(jù)已經(jīng)準(zhǔn)備就緒;同時(shí)如果status返回的是200,那么可以確定該次請(qǐng)求/響應(yīng)過程全部完成
status返回值如下:
注意:這里不要使用statusText去判斷,因?yàn)樵撝翟诳鐬g覽器時(shí)不可靠
最后的返回結(jié)果,不管是什么類型內(nèi)容,都會(huì)保存在responseText中
監(jiān)聽代碼如下:
//監(jiān)聽readyState狀態(tài)與status返回值 request.onreadystatechange = function () {if(request.readyState == 4 && request.status == 200){alert(request.responseText);} }綜上所述的內(nèi)容,就是整個(gè)ajax請(qǐng)求的全部流程,我們?cè)趈s中最后拿到的就是后臺(tái)返回的responseText,這里面保存的一般來說是JSON格式的字符串,我們可以將其轉(zhuǎn)換成數(shù)組或者對(duì)象后提取其中的鍵值對(duì)。
三、封裝使用
一下代碼是將上述的過程進(jìn)行的封裝,使得使用時(shí)只要調(diào)用函數(shù)并在回調(diào)函數(shù)中實(shí)現(xiàn)功能就可以了。
<script> /** method是請(qǐng)求方式* url是網(wǎng)絡(luò)請(qǐng)求的地址* postboidy是post方式請(qǐng)求時(shí)的提交數(shù)據(jù)* successCallback是請(qǐng)求成功的函數(shù)* errorCallback是請(qǐng)求失敗的函數(shù) */function request (method,url,postbody,successCallback,errorCallback) {//創(chuàng)建一個(gè)請(qǐng)求對(duì)象if(window.XMLHttpRequest){var request = new XMLHttpRequest();}else{var request = new ActiveXObject("Microsoft.XMLHttp");}if(arguments[0]=="POST"){//創(chuàng)建請(qǐng)求request.open(method,url,true);//設(shè)置上傳類型request.setRequestHeader("content-type","application/x-www-form-urlencoded");}else if(arguments[0]=="GET"){request.open(method,url,true);}//發(fā)送請(qǐng)求request.send(postbody);//狀態(tài)監(jiān)聽request.onreadystatechange = function () {if(request.readyState ==4 && request.status == 200){//請(qǐng)求成功的回調(diào)函數(shù)if(successCallback){successCallback(request.responseText);}} else if (request.readyState == 4 && request.status != 200) {//請(qǐng)求失敗的回調(diào)函數(shù)if(errorCallback){errorCallback(request.statusText);}}} } </script>使用方法舉例:
下面定義了一個(gè)簡(jiǎn)單的表單提交用戶名和密碼,使用回調(diào)函數(shù)拿到后臺(tái)返回的JSON串后,轉(zhuǎn)換成對(duì)象再取出其中的信息,告知用戶是登陸成功還是失敗。
總結(jié)
- 上一篇: java基础知识陷阱
- 下一篇: final关键字的深入理解