深入理解JavaScript中Ajax
Ajax不是一種新的編程語(yǔ)言,而是使用現(xiàn)有標(biāo)準(zhǔn)的新方法。AJAX可以在不重新加載整個(gè)頁(yè)面的情況下,與服務(wù)器交換數(shù)據(jù)。這種異步交互的方式,使用戶單擊后,不必刷新頁(yè)面也能獲取新數(shù)據(jù)。
XMLHttpRequest對(duì)象
Ajax的核心是XMLHttpRequest對(duì)象(XHR)。XHR為向服務(wù)器發(fā)送請(qǐng)求和解析服務(wù)器響應(yīng)提供了接口。能夠以異步方式從服務(wù)器獲取新數(shù)據(jù)。
在瀏覽器中創(chuàng)建對(duì)象(只支持IE7及更高的版本):
var xhr = new XMLHttpRequest();
XHR的用法
首先要介紹的是open()方法。它接收3個(gè)參數(shù):
•要發(fā)送的請(qǐng)求的類(lèi)型(POST、GET等)
•請(qǐng)求的URL
•表示是否異步發(fā)送請(qǐng)求的布爾值
調(diào)用open()示例:
xhr.open("get", "index.jsp", false);
針對(duì)index.jsp的GET請(qǐng)求。URL相對(duì)于執(zhí)行代碼的當(dāng)前頁(yè)面;調(diào)用open()方法并不會(huì)真正發(fā)送請(qǐng)求,只是啟動(dòng)一個(gè)請(qǐng)求以備發(fā)送。
調(diào)用send()發(fā)送請(qǐng)求:
xhr.send(null);
send()接收一個(gè)參數(shù),即要作為請(qǐng)求主體發(fā)送的數(shù)據(jù)。如果不需要通過(guò)請(qǐng)求主體發(fā)送數(shù)據(jù),則必須傳入null。
相應(yīng)數(shù)據(jù)會(huì)填充到XHR對(duì)象的相關(guān)屬性:
•responseText:作為響應(yīng)主體被返回的文本
•responseXML:作為響應(yīng)的內(nèi)容類(lèi)型是“text/xml”或“application/xml”
•status:響應(yīng)的HTTP狀態(tài)
•statusText:HTTP狀態(tài)的說(shuō)明
在接收響應(yīng)后,首先檢查status屬性,確定響應(yīng)已經(jīng)返回,一般200作為成功的標(biāo)志。狀態(tài)碼304表示資源沒(méi)有修改,可以直接使用瀏覽器中緩存的版本。
為了接收到合適的響應(yīng),應(yīng)該以如下方式檢測(cè)兩種狀態(tài)碼:
xhr.open("get", "index.jsp", false); xhr.send(null); if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { alert(xhr.responseText); } else { alert("Request was unsuccessful: " + xhr.status); }
通過(guò)檢測(cè)readyState屬性,可以確定請(qǐng)求/響應(yīng)過(guò)程的當(dāng)前活動(dòng)階段。
•0:未初始化。未調(diào)用open()方法
•1:?jiǎn)?dòng)。已經(jīng)調(diào)用open()方法,未調(diào)用send()方法
•2:發(fā)送。已經(jīng)調(diào)用send()方法,未接收到響應(yīng)
•3:接收。已經(jīng)接收到部分?jǐn)?shù)據(jù)
•4:完成。已經(jīng)接收到全部數(shù)據(jù),可以在客戶端使用
readyState屬性的值發(fā)生變化時(shí),都會(huì)觸發(fā)一次readystatechange事件。在調(diào)用open()之前指定onreadystatechange事件處理程序才能確保瀏覽器兼容性。
var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) { alert(xhr.responseText); } else { alert("請(qǐng)求成功:" + xhr.status); } } }; xhr.open("get", "index.jsp", true); xhr.send(null);
在接收響應(yīng)之前,可以取消異步請(qǐng)求:
xhr.abort();
HTTP頭部信息
XHR對(duì)象提供了操作請(qǐng)求頭部和響應(yīng)頭部信息的方法。
默認(rèn)情況下,在發(fā)送XHR請(qǐng)求的同時(shí),還會(huì)發(fā)送下列頭部信息。
•Accept:瀏覽器能夠處理的內(nèi)容類(lèi)型
•Accept-Charset:瀏覽器能夠顯示的字符集
•Accept-Encoding:瀏覽器能夠處理的壓縮編碼
•Accept-Language:瀏覽器當(dāng)前設(shè)置的語(yǔ)言
•Connection:瀏覽器與服務(wù)器之間連接的類(lèi)型
•Cookie:當(dāng)前頁(yè)面設(shè)置的任何Cookie
•Host:發(fā)出請(qǐng)求的頁(yè)面所在的域
•Referer:發(fā)出請(qǐng)求的頁(yè)面的URL
•User-Aent:瀏覽器的用戶代理字符串
使用setRequestHeader()可以設(shè)置自定義的請(qǐng)求頭部信息。必須在調(diào)用open()方法之后,且在調(diào)用send()之前,調(diào)用
setRequestHeader():
xhr.open("get", "index.jsp", true); xhr.setRequestHeader("MyHeader", "MyValue"); xhr.send(null);
調(diào)用getResponseHeader()并傳入字段名稱(chēng),可以取得相應(yīng)的響應(yīng)頭部信息。getAllResponseHeader()取得包含所有頭部信息的長(zhǎng)字符串。
var myHeader = xhr.getResponseHeader("MyHeader"); var allHeaders = xhr.getAllResponseHeader();
GET請(qǐng)求
GET用于向服務(wù)器查詢某些信息??梢詫⒉樵冏址畢?shù)追加到URL的末尾,查詢字符串中的每個(gè)參數(shù)的名稱(chēng)和值都必須使用encodeURIComponent()編碼:
xhr.open("get", "login.jsp?name1=value1&name2=value2", false); addURLParam()接收三個(gè)參數(shù):要添加參數(shù)的URL、參數(shù)的名稱(chēng)和參數(shù)的值。 var url = "login.jsp"; // 添加參數(shù) url = addURLParam(url, "username", "xxyh"); url = addURLParam(url, "password", "xxyh123"); // 初始化請(qǐng)求 xhr.open("get", url, false);
POST請(qǐng)求
POST請(qǐng)求用于向服務(wù)器發(fā)送應(yīng)該被保存的數(shù)據(jù)。POST請(qǐng)求的主體可以包含非常多的數(shù)據(jù),而且格式不限。
初始化請(qǐng)求:
xhr.open("post", "login.jsp", true); 首先將Content-Type頭部信息設(shè)置為application/x-www-form-urlencoded,然后建立一個(gè)字符串格式。如果需要將頁(yè)面中的表單數(shù)據(jù)進(jìn)行序列化,然后再通過(guò)XHR發(fā)送到服務(wù)器,可以使用serialize()函數(shù)來(lái)創(chuàng)建這個(gè)字符串: xhr.open("get", "login.jsp", false); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); var form = document.getElementById("user-info"); xhr.send(serialize(form));
以上所述是小編給大家介紹的JavaScript中Ajax的深入理解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
js+HTML5實(shí)現(xiàn)canvas多種顏色漸變效果的方法
這篇文章主要介紹了js+HTML5實(shí)現(xiàn)canvas多種顏色漸變效果的方法,涉及html5屬性的相關(guān)技巧,需要的朋友可以參考下2015-06-06Ionic如何實(shí)現(xiàn)下拉刷新與上拉加載功能
在日常項(xiàng)目開(kāi)發(fā)中我們經(jīng)常見(jiàn)到下拉刷新上拉加載的功能,接下來(lái)通過(guò)本文給大家介紹ionic如何實(shí)現(xiàn)下拉刷新與上拉加載的相關(guān)資料,需要的朋友可以參考下2016-06-06JavaScript開(kāi)發(fā)者必備的10個(gè)Sublime Text插件
Sublime Text幾乎是任何開(kāi)發(fā)者在其工具箱的必備應(yīng)用程序,這篇文章主要介紹了JavaScript開(kāi)發(fā)者必備的10個(gè)Sublime Text插件,感興趣的小伙伴們可以參考一下2016-02-02Angularjs手動(dòng)解析表達(dá)式($parse)
這篇文章主要介紹了Angularjs手動(dòng)解析表達(dá)式($parse)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10詳解XMLHttpRequest(二)響應(yīng)屬性、二進(jìn)制數(shù)據(jù)、監(jiān)測(cè)上傳下載進(jìn)度
這篇文章主要為大家詳細(xì)介紹了XMLHttpRequest響應(yīng)屬性、二進(jìn)制數(shù)據(jù)、監(jiān)測(cè)上傳下載進(jìn)度,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09JavaScript資源預(yù)加載組件和滑屏組件的使用推薦
這篇文章主要介紹了JavaScript資源預(yù)加載組件和滑屏組件的使用推薦,分別為preload和slide的用法講解,使用起來(lái)非常簡(jiǎn)單,需要的朋友可以參考下2016-03-03es6中Promise 對(duì)象基本功能與用法實(shí)例分析
這篇文章主要介紹了es6中Promise 對(duì)象基本功能與用法,結(jié)合實(shí)例形式分析了es6中Promise對(duì)象的基本功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-02-02