關(guān)于原生JS的AJAX

前段時(shí)間,我學(xué)習(xí)了AJAX的相關(guān)基礎(chǔ)內(nèi)容,雖然其中還有許多未明白的地方,但是已經(jīng)可以進(jìn)行最基本的使用的了,所以寫(xiě)下這篇文章作為復(fù)習(xí);

一、什么是AJAX?以及AJAX誕生緣由

  • 什么是AJAX?
    AJAX全稱是異步JS和XML(Asynchronous JavaScript And XML),它由幾種技術(shù)構(gòu)成:包括XML,DOM等;
    通常的使用是利用JS向服務(wù)器發(fā)送HTTP請(qǐng)求,獲取到數(shù)據(jù)后(一般為json或者text格式),再利用DOM將數(shù)據(jù)填充進(jìn)html標(biāo)簽中;

  • AJAX誕生緣由

1999年,微軟公司發(fā)布IE瀏覽器5.0版,第一次引入新功能:允許JavaScript腳本向服務(wù)器發(fā)起HTTP請(qǐng)求。這個(gè)功能當(dāng)時(shí)并沒(méi)有引起注意,直到2004年Gmail發(fā)布和2005年Google Map發(fā)布,才引起廣泛重視。2005年2月,AJAX這個(gè)詞第一次正式提出,指圍繞這個(gè)功能進(jìn)行開(kāi)發(fā)的一整套做法。從此,AJAX成為腳本發(fā)起HTTP通信的代名詞,W3C也在2006年發(fā)布了它的國(guó)際標(biāo)準(zhǔn)。

  • AJAX為何誕生?
    在web發(fā)展的最初期,經(jīng)常使用的表單提交會(huì)默認(rèn)將頁(yè)面卸載(刷新),但當(dāng)時(shí)頁(yè)面功能不多,所以并沒(méi)有很大的影響。
    但是隨著web不斷地發(fā)展,頁(yè)面功能越來(lái)越多,越來(lái)越強(qiáng)大,不只是用來(lái)瀏覽信息,更多了許多與用戶進(jìn)行交互的地方,并且開(kāi)始有用戶對(duì)原始表單提交會(huì)卸載頁(yè)面產(chǎn)生不滿,試想如下例子:
  • 用戶注冊(cè)一個(gè)賬號(hào),輸入了用戶名密碼之類的一大堆資料,然后點(diǎn)擊提交,頁(yè)面刷新,因網(wǎng)速原因等待一分鐘后,提示賬號(hào)已經(jīng)存在,請(qǐng)從新輸入,然后資料又要從新填寫(xiě);
  • 假設(shè)當(dāng)時(shí)的頁(yè)面有點(diǎn)贊功能,點(diǎn)一個(gè)贊刷新整個(gè)頁(yè)面一次,點(diǎn)一個(gè)按鈕又刷新一次;
    上述情況確實(shí)會(huì)讓人感到非常惱火;
    于是,AJAX技術(shù)經(jīng)過(guò)一段時(shí)間的發(fā)展成熟后大規(guī)模的引用到頁(yè)面上,推動(dòng)了web行業(yè)的發(fā)展;

二、XMLHttpRequest對(duì)象

  • 什么是XMLHttpRequest?
    XMLHttpRequest是原生JS的一個(gè)內(nèi)置對(duì)象,用以通過(guò)瀏覽器向服務(wù)器發(fā)送HTTP請(qǐng)求進(jìn)行數(shù)據(jù)交互,XMLHttpRequest是AJAX技術(shù)的核心,學(xué)習(xí)AJAX實(shí)質(zhì)上就是在學(xué)習(xí)XMLHttpRequest;

  • 創(chuàng)建XMLHttpRequest對(duì)象
    一般使用new關(guān)鍵字進(jìn)行創(chuàng)建,然后賦值給一個(gè)變量,如下:

var xhr = new XMLHttpRequest();

三、XMLHttpRequest對(duì)象的屬性

  • XMLHttpRequest對(duì)象的屬性有哪些?有些什么用?
屬性名 作用
readyState 只讀屬性,用于表示XMLHttpRequest請(qǐng)求的當(dāng)前狀態(tài),有五個(gè)數(shù)字(0,1,2,3,4);
0:表示已經(jīng)創(chuàng)建了XMLHttpRequest對(duì)象,但是open方法還未被調(diào)用;
1:表示已調(diào)用open方法,但還未調(diào)用send方法(請(qǐng)求還未被發(fā)送出去),此時(shí)可以對(duì)請(qǐng)求的header進(jìn)行設(shè)定(setRequestHeader方法);
2:send方法已調(diào)用,數(shù)據(jù)已發(fā)送,并且服務(wù)器接收到了請(qǐng)求;
3:表示服務(wù)器正在傳輸數(shù)據(jù);
4:數(shù)據(jù)傳輸完成;
該方法一般在onreadystatechange事件中進(jìn)行查看
status 只讀屬性,表示本次請(qǐng)求的狀態(tài),只返回一個(gè)數(shù)字,常用的有如下幾個(gè)狀態(tài)碼:
200:OK(正常訪問(wèn));
301:Moved Permanently(永久移動(dòng));
302:Moved temporarily(暫時(shí)移動(dòng));
304:Not Modified(未修改);
307:Temporary Redirect(暫時(shí)重定向);
401:Unauthorized (未授權(quán));
403:Forbidden(禁止訪問(wèn));
404:Not Found(未找到該網(wǎng)址);500:Internal Server Error (找到網(wǎng)址但服務(wù)器發(fā)生錯(cuò)誤);
statusText 與status屬性類似,返回本次請(qǐng)求的狀態(tài),不同點(diǎn)在于,status只返回一個(gè)數(shù)字,而該屬性返回?cái)?shù)字和狀態(tài)解析
responseType 可通過(guò)對(duì)該屬性賦值來(lái)指定接收的數(shù)據(jù)類型,默認(rèn)為字符串,有如下幾種數(shù)據(jù)類型:
text:以字符串形式接收數(shù)據(jù);
json:以json對(duì)象形式接收數(shù)據(jù);
blob:blob對(duì)象;
ArrayBuffer:ArrayBuffer對(duì)象;
response
responseText
responseXML
三者都是服務(wù)器返回的數(shù)據(jù),如果數(shù)據(jù)不完整或者獲取失敗,它們的值就為null;
不同點(diǎn):
response返回的是數(shù)據(jù)的主體部分,可以為任何類型(數(shù)組,json,XML,字符串等);
responseText返回從服務(wù)器接收到的字符串;
responseXML返回從服務(wù)器接收到的Document對(duì)象,若返回的數(shù)據(jù)不能解析為XML或者HTML格式,那該屬性的值為null,該值返回的數(shù)據(jù)會(huì)被直接解析DOM;
timeout 該屬性用以設(shè)置發(fā)送請(qǐng)求后多少毫秒后未接到回應(yīng)就自動(dòng)終止請(qǐng)求,0為無(wú)時(shí)間限制,默認(rèn)值為0,可通過(guò)在open方法后send方法前對(duì)其進(jìn)行賦值來(lái)制定
withCredentials 該屬性制定跨域請(qǐng)求時(shí),個(gè)人的cookie信息是否附帶進(jìn)請(qǐng)求herder中,默認(rèn)為false(不攜帶cookie),可通過(guò)對(duì)其進(jìn)行賦值來(lái)制定

四、XMLHttpRequest對(duì)象的方法

方法名 作用
open 類比:撥打電話時(shí)的撥號(hào)行為,確定撥打(連接)的目標(biāo);
open方法用以設(shè)置請(qǐng)求的參數(shù),常用的有三個(gè)參數(shù):
第一個(gè)參數(shù):請(qǐng)求的類型(常用get或者post);
第二個(gè)參數(shù)是接口名和:這里要分兩種情況:
get請(qǐng)求時(shí):接口名+請(qǐng)求參數(shù)(鍵值對(duì)形式);
post請(qǐng)求時(shí):只需要接口名;
第三個(gè)參數(shù):一個(gè)布爾值,指定是否異步(true為異步,false為同步,通常為true,默認(rèn)為true);
第四和第五個(gè)參數(shù):填寫(xiě)用于認(rèn)證的用戶名和密碼;
send 類比:撥打電話時(shí),填寫(xiě)好電話號(hào)碼后按撥打鍵(發(fā)送請(qǐng)求);
send方法用以發(fā)送HTTP請(qǐng)求,需要在open方法調(diào)用后調(diào)用;
參數(shù)分兩種形式:
getget請(qǐng)求時(shí)無(wú)參數(shù);
postpost請(qǐng)求時(shí)參數(shù)為請(qǐng)求參數(shù)(鍵值對(duì)形式)
setRequestHeader 類比:填好電話號(hào)碼后,想好是用人工接聽(tīng)還是機(jī)器人接聽(tīng),再撥打電話(這個(gè)比喻不是很恰當(dāng));
setRequestHeader方法用以設(shè)置請(qǐng)求的header部分,用以指定數(shù)據(jù)發(fā)送的格式,調(diào)用必須在open方法后,send方法前;
常用實(shí)例:setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
abort 類比:撥打電話后把電話給掛了;
abort方法用以中斷已經(jīng)發(fā)出的AJAX請(qǐng)求;
可以用這個(gè)方法來(lái)防止用戶重復(fù)點(diǎn)擊造成的發(fā)送重復(fù)請(qǐng)求的問(wèn)題;
getResponseHeadergetAllResponseHeaders 類比:打印我的通話清單(getResponseHeader為通話清單的指定信息,getAllResponseHeaders為通話清單的所有信息);
getResponseHeadergetAllResponseHeaders之間的不同點(diǎn):getResponseHeader接收一個(gè)參數(shù),該參數(shù)為需要返回的回應(yīng)頭部信息;
getAllResponseHeader無(wú)需參數(shù),返回所有的回應(yīng)頭信息;
overrideMimeType 用以將從服務(wù)器轉(zhuǎn)換回來(lái)的二進(jìn)制信息轉(zhuǎn)換為文本信息,該方法已被responseText屬性代替

五、XMLHttpRequest對(duì)象的事件以及對(duì)應(yīng)的事件監(jiān)聽(tīng)接口

事件名 接口名 作用
readyStateChange(請(qǐng)求狀態(tài)改變事件) onreadystatechange 當(dāng)readyState屬性的值發(fā)生變化時(shí),就會(huì)觸發(fā)readyStateChange,可以對(duì)onreadystatechange指定函數(shù)來(lái)監(jiān)控readyState的值;
注:通常來(lái)說(shuō),一次交互中,readyState的值會(huì)發(fā)生五次變化,也就是說(shuō)會(huì)觸發(fā)五次readyStateChange事件
abort(請(qǐng)求被中斷事件) onabort 通過(guò)onabort事件接口,可指定當(dāng)請(qǐng)求被中斷時(shí)的具體措施
error(請(qǐng)求發(fā)生錯(cuò)誤事件) onerror 通過(guò)onerror事件接口,可指定當(dāng)請(qǐng)求出錯(cuò)時(shí)的具體措施
load(請(qǐng)求完成,數(shù)據(jù)傳輸完畢事件) onload 通過(guò)onload事件接口,可指定當(dāng)數(shù)據(jù)傳輸完畢的具體措施
loadend(請(qǐng)求已完成事件) onloaded abort、error和load這三個(gè)事件的觸發(fā)都會(huì)另外觸發(fā)loadend事件,表示請(qǐng)求已完成,但成功與否未知
對(duì)應(yīng)屬性timeout ontimeout 可通過(guò)ontimeout接口指定當(dāng)用戶請(qǐng)求超時(shí)的措施
progress(文件上傳事件) onprogress 可通過(guò)對(duì)onprogress接口指定措施來(lái)監(jiān)控文件上傳的進(jìn)度

六、AJAX使用實(shí)例以及AJAX的封裝

AJAX封裝使用實(shí)例:列表加載更多

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,467評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,468評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,582評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,794評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,941評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,190評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,026評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評(píng)論 2 375

推薦閱讀更多精彩內(nèi)容

  • 一、什么是AJAX?以及AJAX誕生緣由 什么是AJAX? AJAX全稱是異步JS和XML(Asynchronou...
    風(fēng)起云帆閱讀 276評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,692評(píng)論 25 708
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,809評(píng)論 18 139
  • 知乎上看到活著就是沒(méi)有意義,高興是因?yàn)槎喟桶匪礁撸桓吲d是因?yàn)槎喟桶匪降汀?我認(rèn)同。 或者是為了什么,為了尋找...
    蛋蛋噠O閱讀 222評(píng)論 0 0
  • ——《成為高效能人士,你只差這一個(gè)習(xí)慣》預(yù)熱分身術(shù)訓(xùn)練營(yíng) 我,凡人一個(gè)。 我喜歡做白日夢(mèng),而且更希望這些白日夢(mèng)呢能...
    琳琳93閱讀 253評(píng)論 6 3