大家好,我是IT修真院深圳分院第3期的學(xué)員儡循,一枚正直純潔善良的前端程序員舶吗,今天給大家分享一下,修真院官網(wǎng)前端工程師深度思考中的知識(shí)點(diǎn)——什么是Ajax
一.背景介紹
Ajax的來(lái)歷
套用一句不恰當(dāng)?shù)脑捲裣ィ珹jax就是中間商(并不賺取差價(jià))誓琼,換一個(gè)專業(yè)點(diǎn)的說(shuō)話,現(xiàn)在它就是腳本發(fā)起HTTP通信的代名詞
具體什么是Ajax呢肴捉?我們?cè)谡f(shuō)這個(gè)問題之前腹侣,需要思考一個(gè)問題:當(dāng)我們上網(wǎng)的時(shí)候,我們到底在上什么齿穗?
大部分人都是在上瀏覽器傲隶。
當(dāng)我們?cè)跒g覽器地址欄鍵入一個(gè)網(wǎng)址,或者通過網(wǎng)頁(yè)表單向服務(wù)器提交內(nèi)容的時(shí)候,我們就開始與瀏覽器進(jìn)行交互窃页。而瀏覽器在這個(gè)時(shí)候跺株,開始與服務(wù)器進(jìn)行交互。
傳統(tǒng)的Web應(yīng)用交互由用戶觸發(fā)一個(gè)HTTP請(qǐng)求到服務(wù)器,服務(wù)器對(duì)其進(jìn)行處理后再返回一個(gè)新的HTML頁(yè)到客戶端脖卖。
每當(dāng)服務(wù)器處理客戶端提交的請(qǐng)求時(shí),客戶都只能空閑等待,并且哪怕只是一次很小的交互乒省、只需從服務(wù)器端得到很簡(jiǎn)單的一個(gè)數(shù)據(jù)
都要返回一個(gè)完整的HTML頁(yè),而客戶端每次都要浪費(fèi)時(shí)間和帶寬去重新讀取整個(gè)頁(yè)面。
1999年胚嘲,微軟公司發(fā)布IE瀏覽器5.0版作儿,第一次引入新功能:允許JavaScript腳本向服務(wù)器發(fā)起HTTP請(qǐng)求。這個(gè)功能當(dāng)時(shí)并沒有引起注意,為什么馋劈?
實(shí)際上攻锰,人們一直在尋求改善傳統(tǒng)的web應(yīng)用交互方式。1999年以前妓雾,JS可以通過Java applet或Flash電影等中間層向服務(wù)器發(fā)送請(qǐng)求娶吞。
在Ajax被提出之前,這種技術(shù)就已經(jīng)存在很長(zhǎng)時(shí)間了械姻,那時(shí)候人們通常將這種技術(shù)叫做遠(yuǎn)程腳本(remote scripting)
Ajax技術(shù)的核心是XMLHttpRequest(簡(jiǎn)稱XHR)妒蛇,這是由微軟首先引入的一個(gè)特性,最早應(yīng)用在它的IE5瀏覽器上楷拳。
在IE5中绣夺,XHR對(duì)象是通過MSXML庫(kù)中的一個(gè)ActiveX對(duì)象實(shí)現(xiàn)的,而IE7+及其他標(biāo)準(zhǔn)瀏覽器都支持原生的XHR對(duì)象
在XHR出現(xiàn)之前欢揖,Ajax式的通信必須借助一些hack首選來(lái)實(shí)現(xiàn)陶耍,大多數(shù)使用隱藏或內(nèi)嵌的框架來(lái)。
在XHR出現(xiàn)之后她混,XHR為向?yàn)g覽器發(fā)送請(qǐng)求和解析服務(wù)器響應(yīng)提供了流暢的接口烈钞。
隨著XHR泊碑、JS等各項(xiàng)技術(shù)應(yīng)用得越來(lái)越廣泛,2005年毯欣,依賴XHR的Ajax技術(shù)被提出
瀏覽器與服務(wù)器交互圖例
二.知識(shí)剖析
1馒过、運(yùn)行機(jī)制
2、代碼示例
3酗钞、優(yōu)缺點(diǎn)
1腹忽、運(yùn)行機(jī)制
先看一下Ajax的英文翻譯
AJAX stands for Asynchronous JavaScript and XML.
AJAX is a new technique for creating better, faster, and more interactive web applications with the help of XML, HTML, CSS, and Java Script.
AJAX is based on the following open standards:
Browser-based presentation using HTML and Cascading Style Sheets (CSS).
Data is stored in XML format and fetched from the server.
Behind-the-scenes data fetches using XMLHttpRequest objects in the browser.
JavaScript to make everything happen.
從上可以看出Ajax依賴CSS/HTML/Javascript,而其中最核心的依賴是瀏覽器提供的XMLHttpRequest簡(jiǎn)稱(XHR)對(duì)象算吩,是這個(gè)對(duì)象使得瀏覽器可以發(fā)出HTTP請(qǐng)求與接收HTTP
響應(yīng)留凭。
W3C形象的稱XHR對(duì)象是開發(fā)者的夢(mèng)想
Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了—個(gè)中間層(AJAX引擎),使用戶操作與服務(wù)器響應(yīng)異步化。
并不是所有的用戶請(qǐng)求都提交給服務(wù)器,像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給Ajax引擎自己來(lái)做, 只有確定需要從服務(wù)器讀取新數(shù)據(jù)時(shí)再由Ajax引擎代為向服務(wù)器提交請(qǐng)求偎巢。
Ajax就這樣集齊CSS、JavaScript兼耀、XMLHTTPRequest压昼、DOM對(duì)象四神獸,通過XmlHttpRequest
對(duì)象來(lái)向服務(wù)器發(fā)異步請(qǐng)求瘤运,從服務(wù)器獲得數(shù)據(jù)窍霞,然后用JavaScript來(lái)操作DOM、改變CSS拯坟,更新頁(yè)面但金。
Ajax重要影響是使WEB中的界面與應(yīng)用分離(也可以說(shuō)是數(shù)據(jù)與呈現(xiàn)分離),而在以前兩者是沒有清晰的界限的郁季。
數(shù)據(jù)與呈現(xiàn)分離的分離冷溃,有利于分工合作、減少非技術(shù)人員對(duì)頁(yè)面的修改造成的WEB應(yīng)用程序錯(cuò)誤梦裂、提高效率似枕、也更加適用于現(xiàn)在的發(fā)布系統(tǒng)。
也可以把以前的一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端年柠,利于客戶端閑置的處理能力來(lái)處理凿歼。
2、代碼示例
一段使用XMLHttpRequest發(fā)送Ajax請(qǐng)求的簡(jiǎn)單示例代碼冗恨。
function sendAjax() {
//構(gòu)造表單數(shù)據(jù)
var formData = new FormData();
formData.append('username', 'johndoe');
formData.append('id', 123456);
//創(chuàng)建xhr對(duì)象
var xhr = new XMLHttpRequest();
//設(shè)置xhr請(qǐng)求的超時(shí)時(shí)間
xhr.timeout = 3000;
//設(shè)置響應(yīng)返回的數(shù)據(jù)格式
xhr.responseType = "text";
//創(chuàng)建一個(gè) post 請(qǐng)求答憔,采用異步
xhr.open('POST', '/server', true);
//注冊(cè)相關(guān)事件回調(diào)處理函數(shù)
xhr.onload = function(e) {
if(this.status == 200||this.status == 304){
alert(this.responseText);
}
};
xhr.ontimeout = function(e) { ... };
xhr.onerror = function(e) { ... };
xhr.upload.onprogress = function(e) { ... };
//發(fā)送數(shù)據(jù)
xhr.send(formData);
}
上面是一個(gè)使用xhr發(fā)送表單數(shù)據(jù)的示例,整個(gè)流程可以參考注釋掀抹。
3虐拓、優(yōu)缺點(diǎn)
(1).AJAX的優(yōu)點(diǎn)
<1>.無(wú)刷新更新數(shù)據(jù)。AJAX最大優(yōu)點(diǎn)就是能在不刷新整個(gè)頁(yè)面的前提下與服務(wù)器通信維護(hù)數(shù)據(jù)渴丸。這使得Web應(yīng)用程序更為迅捷地響應(yīng)用戶交互侯嘀,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒有改變的信息另凌,減少用戶等待時(shí)間,帶來(lái)非常好的用戶體驗(yàn)戒幔。
<2>.異步與服務(wù)器通信吠谢。
AJAX使用異步方式與服務(wù)器通信,不需要打斷用戶的操作诗茎,具有更加迅速的響應(yīng)能力工坊。優(yōu)化了Browser和Server之間的溝通,減少不必要的數(shù)據(jù)傳輸敢订、時(shí)間及降低網(wǎng)絡(luò)上數(shù)據(jù)流量王污。
<3>.前端和后端負(fù)載平衡。
AJAX可以把以前一些服務(wù)器負(fù)擔(dān)的工作轉(zhuǎn)嫁到客戶端楚午,利用客戶端閑置的能力來(lái)處理昭齐,減輕服務(wù)器和帶寬的負(fù)擔(dān),節(jié)約空間和寬帶租用成本矾柜。并且減輕服務(wù)器的負(fù)擔(dān)阱驾,AJAX的原則是“按需取數(shù)據(jù)”,可以最大程度的減少冗余請(qǐng)求和響應(yīng)對(duì)服務(wù)器造成的負(fù)擔(dān)怪蔑,提升站點(diǎn)性能
<4>.基于標(biāo)準(zhǔn)被廣泛支持里覆。
AJAX基于標(biāo)準(zhǔn)化的并被廣泛支持的技術(shù),不需要下載瀏覽器插件或者小程序缆瓣,但需要客戶允許JavaScript在瀏覽器上執(zhí)行喧枷。隨著Ajax的成熟,一些簡(jiǎn)化Ajax使用方法的程序庫(kù)也相繼問世弓坞。同樣隧甚,也出現(xiàn)了另一種輔助程序設(shè)計(jì)的技術(shù),為那些不支持JavaScript的用戶提供替代功能昼丑。
<5>.界面與應(yīng)用分離呻逆。
Ajax使WEB中的界面與應(yīng)用分離(也可以說(shuō)是數(shù)據(jù)與呈現(xiàn)分離),有利于分工合作菩帝、減少非技術(shù)人員對(duì)頁(yè)面的修改造成的WEB應(yīng)用程序錯(cuò)誤咖城、提高效率、也更加適用于現(xiàn)在的發(fā)布系統(tǒng)呼奢。
(2).AJAX的缺點(diǎn)
<1>.AJAX干掉了Back和History功能宜雀,即對(duì)瀏覽器機(jī)制的破壞。
在動(dòng)態(tài)更新頁(yè)面的情況下握础,用戶無(wú)法回到前一個(gè)頁(yè)面狀態(tài)辐董,因?yàn)闉g覽器僅能記憶歷史記錄中的靜態(tài)頁(yè)面。一個(gè)被完整讀入的頁(yè)面與一個(gè)已經(jīng)被動(dòng)態(tài)修改過的頁(yè)面之間的差別非常微妙禀综;用戶通常會(huì)希望單擊后退按鈕能夠取消他們的前一次操作简烘,但是在Ajax應(yīng)用程序中苔严,這將無(wú)法實(shí)現(xiàn)。
<2>.AJAX的安全問題孤澎。
AJAX技術(shù)給用戶帶來(lái)很好的用戶體驗(yàn)的同時(shí)也對(duì)IT企業(yè)帶來(lái)了新的安全威脅届氢,Ajax技術(shù)就如同對(duì)企業(yè)數(shù)據(jù)建立了一個(gè)直接通道。這使得開發(fā)者在不經(jīng)意間會(huì)暴露比以前更多的數(shù)據(jù)和服務(wù)器邏輯覆旭。Ajax的邏輯可以對(duì)客戶端的安全掃描技術(shù)隱藏起來(lái)退子,允許黑客從遠(yuǎn)端服務(wù)器上建立新的攻擊。還有Ajax也難以避免一些已知的安全弱點(diǎn)型将,諸如跨站點(diǎn)腳步攻擊寂祥、SQL注入攻擊和基于Credentials的安全漏洞等等。
<3>.對(duì)搜索引擎支持較弱七兜。
對(duì)搜索引擎的支持比較弱丸凭。如果使用不當(dāng),AJAX會(huì)增大網(wǎng)絡(luò)數(shù)據(jù)的流量惊搏,從而降低整個(gè)系統(tǒng)的性能贮乳。
<4>.破壞程序的異常處理機(jī)制。
<5>.違背URL和資源定位的初衷恬惯。
例如,我給你一個(gè)URL地址亚茬,如果采用了Ajax技術(shù)酪耳,也許你在該URL地址下面看到的和我在這個(gè)URL地址下看到的內(nèi)容是不同的。這個(gè)和資源定位的初衷是相背離的刹缝。
<6>.AJAX不能很好支持移動(dòng)設(shè)備碗暗。
一些手持設(shè)備(如手機(jī)、PDA等)現(xiàn)在還不能很好的支持Ajax梢夯,比如說(shuō)我們?cè)谑謾C(jī)的瀏覽器上打開采用Ajax技術(shù)的網(wǎng)站時(shí)言疗,它目前是不支持的。
<7>.客戶端過肥颂砸,太多客戶端代碼造成開發(fā)上的成本噪奄。
編寫復(fù)雜、容易出錯(cuò) 人乓;冗余代碼比較多(層層包含js文件是AJAX的通病勤篮,再加上以往的很多服務(wù)端代碼現(xiàn)在放到了客戶端);破壞了Web的原有標(biāo)準(zhǔn)色罚。
需要注意的是:
Ajax開發(fā)時(shí)碰缔,網(wǎng)絡(luò)延遲——即用戶發(fā)出請(qǐng)求到服務(wù)器發(fā)出響應(yīng)之間的間隔——需要慎重考慮。不給予用戶明確的回應(yīng)戳护,沒有恰當(dāng)?shù)念A(yù)讀數(shù)據(jù)金抡,或者對(duì)XMLHttpRequest的不恰當(dāng)處理瀑焦,都會(huì)使用戶感到延遲,這是用戶不希望看到的梗肝,也是他們無(wú)法理解的榛瓮。通常的解決方案是,使用一個(gè)可視化的組件來(lái)告訴用戶系統(tǒng)正在進(jìn)行后臺(tái)操作并且正在讀取數(shù)據(jù)和內(nèi)容统捶。
3.常見問題
1榆芦、IE瀏覽器下面的緩存問題
2、跨域問題
3喘鸟、Ajax亂碼問題
4匆绣、使用post提交的時(shí)候需要設(shè)置content-type為"application/x-www-form-urlencoded"
5、Ajax對(duì)象屬性的大小寫問題
6什黑、Ajax狀態(tài)為0的問題
下面一一講解常見問題出現(xiàn)的原因和解決辦法
四.解決方案
1. 緩存問題
在IE瀏覽器下面使用get請(qǐng)求時(shí)崎淳,如果第一次請(qǐng)求了數(shù)據(jù)之后IE會(huì)自動(dòng)緩存數(shù)據(jù),如果下一次再發(fā)送同樣的
請(qǐng)求的時(shí)候?yàn)g覽器會(huì)自動(dòng)先去找緩存顯示出來(lái)愕把,所以如果請(qǐng)求的數(shù)據(jù)有變化的時(shí)候拣凹,這里是看不到變化的。
解決辦法:
xhr.open("get","xxxx.aspx?_dc="+new Date().getTime(),true);
就是在請(qǐng)求的后面 加上時(shí)間戳或是隨機(jī)數(shù)恨豁,讓url變成唯一嚣镜,或者是,改成post請(qǐng)求橘蜜。
(get和post請(qǐng)求的區(qū)別可參見 淺談HTTP中Get與Post的區(qū)別)
2. 跨域問題
這是我們目前見到的最多的菊匿,也是最熟悉的一個(gè)問題。本地上面直接采用Nginx跨域?qū)崿F(xiàn)计福。在服務(wù)器上實(shí)現(xiàn)跨域跌捆,可以通過后端達(dá)成,可參考
>跨域有幾種處理方式象颖?
注意 Nginx跨域可以同時(shí)配置多個(gè)接口的佩厚,就是多寫幾個(gè)location就好了,然后location后面帶的參數(shù)不一樣就可以了说订。

3. Ajax亂碼問題
亂碼問題雖然我們目前遇到的不多抄瓦,但是也屬于比較常見的一個(gè)問題了。出現(xiàn)的主要原因就是編碼不一致導(dǎo)致的克蚂。
如果出現(xiàn)亂碼問題了闺鲸,首先檢查一下meta聲明的charset要和請(qǐng)求的頁(yè)面返回的charset一致。response.charset="gb2312 or utf-8"
4. 使用post提交的時(shí)候需要進(jìn)行的設(shè)置
content-Type: application/x-www-form-urlencoded;
//jQuery中埃叭,
content-Type: application/x-www-form-urlencoded;charset=utf-8;
//AngularJS中$http
content-Type: application/json; charset=utf-8;
//使用原生Ajax需要在open以后才能使用xhr.setRequestHeader()方法摸恍,否則出錯(cuò)
xhr.open("post","xxxx.aspx",true);
xhr.setRequestHeader("content-type","application/x-www-form-urlencoded")
//用原生寫時(shí)必須在open()方法之后send()方法之前調(diào)用
5. Ajax對(duì)象屬性的大小寫問題
有些瀏覽器比如火狐,對(duì)大小寫是敏感的,if (xhr.readystate==4)這種寫法立镶,
在IE下是成立的壁袄,但是在Firefox下就行不通了,因?yàn)镮E不區(qū)分大小寫媚媒,F(xiàn)irefox是區(qū)分大小的嗜逻。標(biāo)準(zhǔn)寫法為if (xhr.readyState==4),同理還有屬性
responseText缭召,responseXML栈顷。習(xí)慣采用駝峰形式的寫法可以避免這個(gè)問題。
6. Ajax狀態(tài)0的問題
有時(shí)候在測(cè)試Ajax代碼的時(shí)候加了 xhr.status==200的判斷后嵌巷,一直不執(zhí)行xhr.status==200的代碼萄凤,
這個(gè)就需要注意了。xhr.status==200是要通過服務(wù)器確認(rèn)后來(lái)返回的搪哪,在服務(wù)器頁(yè)面沒有發(fā)生錯(cuò)誤或者轉(zhuǎn)向時(shí)才返回200狀態(tài)的靡努,
此狀態(tài)和你通過瀏覽器訪問頁(yè)面時(shí)服務(wù)器定義的狀態(tài)一致。直接拖進(jìn)瀏覽器瀏覽結(jié)果或者雙擊運(yùn)行html頁(yè)面的晓折,未發(fā)生錯(cuò)誤時(shí)惑朦,此時(shí)的xhr.status是0,不是200漓概。
1. 緩存問題
在IE瀏覽器下面使用get請(qǐng)求時(shí)漾月,如果第一次請(qǐng)求了數(shù)據(jù)之后IE會(huì)自動(dòng)緩存數(shù)據(jù),如果下一次再發(fā)送同樣的
請(qǐng)求的時(shí)候?yàn)g覽器會(huì)自動(dòng)先去找緩存顯示出來(lái)胃珍,所以如果請(qǐng)求的數(shù)據(jù)有變化的時(shí)候栅屏,這里是看不到變化的。
解決辦法:
xhr.open("get","xxxx.aspx?_dc="+new Date().getTime(),true);
就是在請(qǐng)求的后面 加上時(shí)間戳或是隨機(jī)數(shù)堂鲜,讓url變成唯一,或者是护奈,改成post請(qǐng)求缔莲。
(get和post請(qǐng)求的區(qū)別可參見淺談HTTP中Get與Post的區(qū)別)
2. 跨域問題
這是我們目前見到的最多的,也是最熟悉的一個(gè)問題霉旗。本地上面直接采用Nginx跨域?qū)崿F(xiàn)痴奏。在服務(wù)器上實(shí)現(xiàn)跨域,可以通過后端達(dá)成厌秒,可參考
>跨域有幾種處理方式读拆?
注意 Nginx跨域可以同時(shí)配置多個(gè)接口的,就是多寫幾個(gè)location就好了鸵闪,然后location后面帶的參數(shù)不一樣就可以了檐晕。
3. Ajax亂碼問題
亂碼問題雖然我們目前遇到的不多,但是也屬于比較常見的一個(gè)問題了。出現(xiàn)的主要原因就是編碼不一致導(dǎo)致的辟灰。
如果出現(xiàn)亂碼問題了个榕,首先檢查一下meta聲明的charset要和請(qǐng)求的頁(yè)面返回的charset一致。response.charset="gb2312 or utf-8"
4. 使用post提交的時(shí)候需要進(jìn)行的設(shè)置
content-Type: application/x-www-form-urlencoded;
//jQuery中芥喇,
content-Type: application/x-www-form-urlencoded;charset=utf-8;
//AngularJS中$http
content-Type: application/json; charset=utf-8;
//使用原生Ajax需要在open以后才能使用xhr.setRequestHeader()方法西采,否則出錯(cuò)
xhr.open("post","xxxx.aspx",true);
xhr.setRequestHeader("content-type","application/x-www-form-urlencoded")
//用原生寫時(shí)必須在open()方法之后send()方法之前調(diào)用
5. Ajax對(duì)象屬性的大小寫問題
有些瀏覽器比如火狐,對(duì)大小寫是敏感的继控,if (xhr.readystate==4)這種寫法械馆,
在IE下是成立的,但是在Firefox下就行不通了武通,因?yàn)镮E不區(qū)分大小寫霹崎,F(xiàn)irefox是區(qū)分大小的。標(biāo)準(zhǔn)寫法為if (xhr.readyState==4)厅须,同理還有屬性
responseText仿畸,responseXML。習(xí)慣采用駝峰形式的寫法可以避免這個(gè)問題朗和。
6. Ajax狀態(tài)0的問題
有時(shí)候在測(cè)試Ajax代碼的時(shí)候加了 xhr.status==200的判斷后错沽,一直不執(zhí)行xhr.status==200的代碼,
這個(gè)就需要注意了眶拉。xhr.status==200是要通過服務(wù)器確認(rèn)后來(lái)返回的千埃,在服務(wù)器頁(yè)面沒有發(fā)生錯(cuò)誤或者轉(zhuǎn)向時(shí)才返回200狀態(tài)的,
此狀態(tài)和你通過瀏覽器訪問頁(yè)面時(shí)服務(wù)器定義的狀態(tài)一致忆植。直接拖進(jìn)瀏覽器瀏覽結(jié)果或者雙擊運(yùn)行html頁(yè)面的放可,未發(fā)生錯(cuò)誤時(shí),此時(shí)的xhr.status是0朝刊,不是200耀里。
5.編碼實(shí)戰(zhàn)
jQuery方法
$.ajax({
url:"student-ajax/student",
type:"POST",
dataType:"json",
data:{
name:$("#names").val(),
qq:$("#QQs").val(),
},
success:function(data){
console.log(data);
if(data.code === 200){
alert($("#names").val() + "學(xué)員信息" +data.message);
}else{
alert(data.message);
}
},
error:function(data){
console.log(data);
alert("添加失敗");
}
});
}) ;
AngularJS方法
$http({
method:'get',
url:('/a/a/all/document?type=1&page='+$scope.page),
headers:{'Content-Type':'application/x-www-form-urlencoded'}
})
.success(function (response) {
console.log(response.total);
console.log(response);
// if (response.message === "查詢成功") {
$scope.userList = response.data;
$scope.userTotal = response.total;
$scope.page=response.page;
// console.log($scope.userList.total);
});
Javascript原生方法
var request = new XMLHttpRequest(); // 新建XMLHttpRequest對(duì)象;
request.onreadystatechange = function () { // 狀態(tài)發(fā)生變化時(shí),函數(shù)被回調(diào);
if (request.readyState === 4) { // 成功完成
// 判斷響應(yīng)結(jié)果:
if (request.status === 200) {
// 成功拾氓,通過responseText拿到響應(yīng)的文本:
return success(request.responseText);
} else {
// 失敗冯挎,根據(jù)響應(yīng)碼判斷失敗原因:
return fail(request.status);
}
} else {
// HTTP請(qǐng)求還在繼續(xù)...
}
}
// 發(fā)送請(qǐng)求:
request.open("POST","/skill-ajax/a/login",true);
request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
request.send();
alert('請(qǐng)求已發(fā)送,請(qǐng)等待響應(yīng)...');
// readyState值說(shuō)明
// 0,初始化,XHR對(duì)象已經(jīng)創(chuàng)建,還未執(zhí)行open
// 1,載入,已經(jīng)調(diào)用open方法,但是還沒發(fā)送請(qǐng)求
// 2,載入完成,請(qǐng)求已經(jīng)發(fā)送完成
// 3,交互,可以接收到部分?jǐn)?shù)據(jù)
// status值說(shuō)明
// 200:成功
// 404:沒有發(fā)現(xiàn)文件咙鞍、查詢或URl
// 500:服務(wù)器產(chǎn)生內(nèi)部錯(cuò)誤
原生的講解
(1)
在使用xhr對(duì)象發(fā)送請(qǐng)求和處理請(qǐng)求響應(yīng)之前房官,必須先用js語(yǔ)言創(chuàng)建一個(gè)xhr對(duì)象。由于xhr對(duì)象當(dāng)前還不是w3c標(biāo)準(zhǔn)续滋,所以才有多種方式進(jìn)行創(chuàng)建以解決兼容性問題翰守。具體創(chuàng)建方式如下:
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
(2) 向服務(wù)器發(fā)送請(qǐng)求
(a) open(method,url,async)
規(guī)定請(qǐng)求的類型、URL 以及是否異步處理請(qǐng)求疲酌。
method:請(qǐng)求的類型蜡峰;GET 或 POST
url:文件在服務(wù)器上的位置
async:true(異步)或 false(同步)
(b)send(string)
將請(qǐng)求發(fā)送到服務(wù)器。
string:僅用于 POST 請(qǐng)求
6.擴(kuò)展思考
AngularJS請(qǐng)求的時(shí)候,success()和then()方法的區(qū)別?
$http({
url:'data.json',
method:'GET'
}).success(function(data,header,config,status){
//code goes here
}).error(function(data,header,config,status) {
//code goes here
});
var promise = $http({
url:'data.json',
method:'GET'
});
promise.then(function(resp) {
//resp是一個(gè)響應(yīng)對(duì)象
}, function() {
//帶有錯(cuò)誤信息的resp
})
要將區(qū)別先弄清$http服務(wù),它是對(duì)原生XMLHttpRequest對(duì)象的簡(jiǎn)單封裝事示,是只能接受一個(gè)參數(shù)的方法早像,這個(gè)方法會(huì)返回一個(gè)promise對(duì)象,具有sccess和error兩個(gè)方法肖爵。當(dāng)然卢鹦,我們也可以在響應(yīng)返回時(shí)用then方法來(lái)處理,會(huì)得到一個(gè)特殊的參數(shù)劝堪,代表了對(duì)象的成功或失敗信息冀自,或者可以使用success和error回調(diào)代替。
這樣就很明晰了秒啦,then方法和success方法的主要區(qū)別就是熬粗,then方法會(huì)接受到完整的響應(yīng)對(duì)象,信息更為全面余境,而success則會(huì)對(duì)響應(yīng)對(duì)象進(jìn)行析構(gòu)驻呐,使用起來(lái)更為方便。
7.參考文獻(xiàn)
參考一:什么是跨域
參考二:AngularJS中then和success的區(qū)別
參考三:Ajax常見問題
參考四:你真的會(huì)使用XMLHttpRequest嗎芳来?
參考五:AJAX工作原理及其優(yōu)缺點(diǎn)
參考六:深入理解ajax系列第一篇——XHR對(duì)象
參考七:XMLHttpRequest 對(duì)象
8.更多討論
題外話含末,沒有ajax的時(shí)候茂蚓,怎樣提高用戶的體驗(yàn)武翎?
PPT連接:
視頻鏈接
如果這篇文章對(duì)你有幫助顽聂,并且使你對(duì)修真院免費(fèi)在線學(xué)習(xí)感興趣肥惭,可以通過我的鏈接注冊(cè)成員會(huì),這會(huì)使我得到學(xué)分(兌換學(xué)時(shí))延長(zhǎng)學(xué)習(xí)時(shí)間:
邀請(qǐng)鏈接:http://www.jnshu.com/login/1/13374512
邀請(qǐng)碼:13374512