搞懂原生AJAX

1. 什么是AJAX艇潭?它又能做什么诫硕?

先來看看這個(gè)名稱的構(gòu)成:Asynchronous JavaScript and XML
顧名思義祠饺,也就是異步的javascript和XML伍俘,而XML 被設(shè)計(jì)用來傳輸和存儲(chǔ)數(shù)據(jù)粘咖。所以也可以理解為異步的請(qǐng)求數(shù)據(jù)蚣抗。
來看看度娘給的答案:

  • AJAX 不是一門編程語言,是一種用于創(chuàng)建快速動(dòng)態(tài)網(wǎng)頁的技術(shù)(方法)
  • AJAX 最大的優(yōu)點(diǎn)是在不重新加載整個(gè)頁面的情況下瓮下,可以與服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁內(nèi)容翰铡。
  • AJAX 不需要任何瀏覽器插件,但需要用戶允許JavaScript在瀏覽器上執(zhí)行讽坏。

因?yàn)榻?jīng)常使用 jQuery 來做請(qǐng)求的原因锭魔,經(jīng)常會(huì)把 AJAX 理解為是jQuery獨(dú)有的東西,其實(shí)完全不是路呜,AJAX和jQuery是兩個(gè)東西迷捧,只不過是jQuery對(duì)其做了封裝而已。

2. AJAX能做什么胀葱?

在傳統(tǒng)的網(wǎng)頁(不使用 AJAX)如果需要更新內(nèi)容漠秋,必須重載整個(gè)網(wǎng)頁頁面淹遵。
可以創(chuàng)建一個(gè) form 表單模擬一下扼仲,當(dāng)點(diǎn)擊 submit 提交表單的時(shí)候吕晌,瀏覽器就會(huì)刷新頁面降传,然后在新頁面里告訴你操作是成功了還是失敗了。如果不幸由于網(wǎng)絡(luò)太慢或者其他原因航棱,就會(huì)得到一個(gè)404頁面骇两。
如果要讓用戶留在當(dāng)前頁面中宴咧,同時(shí)發(fā)出新的HTTP請(qǐng)求朝群,就必須用JavaScript發(fā)送這個(gè)新請(qǐng)求燕耿,接收到數(shù)據(jù)后,再用JavaScript更新頁面姜胖,這樣一來誉帅,用戶就感覺自己仍然停留在當(dāng)前頁面,但是數(shù)據(jù)卻可以不斷地更新右莱。也就是以回調(diào)函數(shù)的形式蚜锨,進(jìn)行一個(gè)異步的操作,例如點(diǎn)擊 submit 按鈕慢蜓,頁面并未刷新亚再,等數(shù)據(jù)返回成功之后,直接渲染到頁面晨抡。
通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換氛悬,AJAX可以使網(wǎng)頁實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下耘柱,對(duì)網(wǎng)頁的某部分進(jìn)行更新如捅。也就是我們常說的局部刷新。-----這就是AJAX的作用

2. AJAX怎么用调煎?

來看看如何實(shí)現(xiàn)一個(gè)AJAX:

  • XMLHttpRequest 對(duì)象是 AJAX 的基礎(chǔ)镜遣。
    XMLHttpRequest 用于在后臺(tái)與服務(wù)器交換數(shù)據(jù)。這意味著可以在不重新加載整個(gè)網(wǎng)頁的情況下士袄,對(duì)網(wǎng)頁的某部分進(jìn)行更新悲关。
    所有現(xiàn)代瀏覽器均支持 XMLHttpRequest 對(duì)象(IE5 和 IE6 使用 ActiveXObject)。

  • 所以首先要?jiǎng)?chuàng)建一個(gè) XMLHttpRequest 對(duì)象

    // 第一步:創(chuàng)建一個(gè) XMLHttpRequest 請(qǐ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");
    }
    console.dir(xmlhttp );// 看一下 XMLHttpRequest 對(duì)象都有哪些東西
    

    在控制臺(tái)娄柳,先看一下 XMLHttpRequest 對(duì)象都有哪些東西:

    XMLHttpRequest

    XMLHttpRequest 對(duì)象及其原型上有很多屬性和方法坚洽,看看這些屬性和方法如何構(gòu)成一個(gè)異步請(qǐng)求:

    1. 向服務(wù)器發(fā)送請(qǐng)求 -------- open()send()
      XMLHttpRequest 對(duì)象中 open()send() 方法是用來向服務(wù)發(fā)送請(qǐng)求的

      • open() :規(guī)定請(qǐng)求的類型、URL以及請(qǐng)求方式
        語法:open(method,url,async)
        參數(shù)說明:
        • method請(qǐng)求的類型西土,GETPOST
          與 POST 相比讶舰,GET 更簡(jiǎn)單也更快,并且在大部分情況下都能用需了。
          然而跳昼,在以下情況中,請(qǐng)使用 POST 請(qǐng)求:
          - 無法使用緩存文件(需要更新服務(wù)器上的文件或數(shù)據(jù)庫(GET請(qǐng)求可能會(huì)請(qǐng)求緩存文件肋乍,狀態(tài)碼304))
          - 向服務(wù)器發(fā)送大量數(shù)據(jù)(POST 沒有數(shù)據(jù)量限制)
          - 發(fā)送包含未知字符的用戶輸入時(shí)鹅颊,POST 比 GET 更穩(wěn)定也更可靠
        • url文件在服務(wù)器上的位置,也就是請(qǐng)求的路徑
        • async請(qǐng)求的方式墓造,true(異步)或false(同步)堪伍,默認(rèn)為 true锚烦;
          一定要考慮好什么情況下才設(shè)置為false,因?yàn)?false 狀態(tài)為同步狀態(tài)帝雇,在請(qǐng)求過程中涮俄,瀏覽器將停止響應(yīng),直到AJAX請(qǐng)求完成尸闸。

      了解了如何發(fā)送請(qǐng)求之后彻亲,我們來通過創(chuàng)建的XMLHttpRequest對(duì)象來發(fā)送一個(gè)請(qǐng)求

      // 第二步:發(fā)送請(qǐng)求
      xmlhttp.open('GET', '/data/test.txt', true); // 這里請(qǐng)求的是一個(gè)本地的文件
      xmlhttp.send();
      
    2. 處理服務(wù)器響應(yīng)-----當(dāng)請(qǐng)求發(fā)送到服務(wù)器以后,服務(wù)器會(huì)做出響應(yīng)吮廉,需要執(zhí)行一些基于這些響應(yīng)的任務(wù)苞尝。
      XMLHttpRequest對(duì)象的三個(gè)重要的屬性:

      • onreadystatechange :響應(yīng)的回調(diào)函數(shù),每當(dāng) readystate 發(fā)生變化時(shí)宦芦,都會(huì)執(zhí)行該函數(shù)
      • readystate : 存有 XMLHttpRequest 的狀態(tài)信息宙址,是指運(yùn)行請(qǐng)求所經(jīng)歷的過程,無論訪問是否成功都將響應(yīng)的步驟调卑。從 0 到 4 發(fā)生變化曼氛。
        • 0:請(qǐng)求未初始化
        • 1:服務(wù)器連接已建立
        • 2:請(qǐng)求已接收
        • 3:請(qǐng)求處理中
        • 4:請(qǐng)求已完成
      • status: HTTP狀態(tài)碼,無論請(qǐng)求是否成功令野,都會(huì)返回舀患。由HTTP協(xié)議根據(jù)所提交的信息,服務(wù)器所返回的HTTP頭信息代碼气破。(由1-5開頭的三位數(shù)字組成)
        • 1xx:信息響應(yīng)類聊浅,表示接收到請(qǐng)求并且繼續(xù)處理
        • 2xx:處理成功響應(yīng)類,表示動(dòng)作被成功接收现使、理解和接受
        • 3xx:重定向響應(yīng)類低匙,為了完成指定的動(dòng)作,必須接受進(jìn)一步處理
        • 4xx:客戶端錯(cuò)誤碳锈,客戶請(qǐng)求包含語法錯(cuò)誤或者是不能正確執(zhí)行
        • 5xx:服務(wù)端錯(cuò)誤顽冶,服務(wù)器不能正確執(zhí)行一個(gè)正確的請(qǐng)求
          常見的http狀態(tài)碼:
        • 200:請(qǐng)求成功
        • 304:該資源在上次請(qǐng)求之后沒有任何修改,表示使用的為緩存文件售碳,請(qǐng)求方式為GET的時(shí)候需要注意
        • 400:無法找到請(qǐng)求資源
        • 401:訪問資源的權(quán)限不夠
        • 403:沒有權(quán)限訪問資源
        • 404:請(qǐng)求路徑錯(cuò)誤强重,需要訪問的資源不存在
        • 405:需要訪問的資源被禁止訪問
        • 407:訪問的資源需要代理身份驗(yàn)證
        • 414:請(qǐng)求的URL過長(zhǎng)
        • 500:服務(wù)器內(nèi)部錯(cuò)誤
          更多狀態(tài)碼信息說明:http://www.runoob.com/ajax/ajax-xmlhttprequest-onreadystatechange.html
    3. 接收服務(wù)器響應(yīng)
      responseTextresponseXML 屬性接受服務(wù)器響應(yīng)

      • responseText :獲得字符串形式的響應(yīng)數(shù)據(jù)。
      • responseXML:獲得 XML 形式的響應(yīng)數(shù)據(jù)贸人。

      知道了如何處理服務(wù)器響應(yīng)及接收服務(wù)器響應(yīng)之后间景,我們來處理并接收服務(wù)器響應(yīng)

      // 第三步:處理服務(wù)器響應(yīng)
      xmlhttp.onreadystatechange = function (){
        // 判斷請(qǐng)求是否已經(jīng)完成
        if (xmlhttp.state === 4){
          // 判斷請(qǐng)求是否成功
          if (xmlhttp.status === 200) {
            // 第四步:接收服務(wù)器響應(yīng)
            // 將返回的數(shù)據(jù)渲染在DOM中
            document.getElementById('test').innerText = request.responseText;
          } else {
           // 如果請(qǐng)求不成功,輸出狀態(tài)碼艺智,根據(jù)狀態(tài)碼判斷錯(cuò)誤原因
            console.log(xmlhttp.status);
          }
        }
      }
      

      /data/test.txt 中的數(shù)據(jù)為字符串: Hello AJAX!
      查看頁面數(shù)據(jù)渲染的結(jié)果倘要,(需要啟動(dòng)一個(gè)本地web服務(wù),這里使用的是live-server):

      渲染結(jié)果

      至此十拣,一個(gè)完整的原生AJAX就出來了封拧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末志鹃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泽西,更是在濱河造成了極大的恐慌曹铃,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尝苇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡埠胖,警方通過查閱死者的電腦和手機(jī)糠溜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來直撤,“玉大人非竿,你說我怎么就攤上這事∧笔” “怎么了红柱?”我有些...
    開封第一講書人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蓖乘。 經(jīng)常有香客問我锤悄,道長(zhǎng),這世上最難降的妖魔是什么嘉抒? 我笑而不...
    開封第一講書人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任零聚,我火速辦了婚禮,結(jié)果婚禮上些侍,老公的妹妹穿的比我還像新娘隶症。我一直安慰自己,他們只是感情好岗宣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開白布蚂会。 她就那樣靜靜地躺著,像睡著了一般耗式。 火紅的嫁衣襯著肌膚如雪胁住。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評(píng)論 1 308
  • 那天刊咳,我揣著相機(jī)與錄音措嵌,去河邊找鬼。 笑死芦缰,一個(gè)胖子當(dāng)著我的面吹牛企巢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播让蕾,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼浪规,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼或听!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笋婿,我...
    開封第一講書人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤誉裆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缸濒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體足丢,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年庇配,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斩跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捞慌,死狀恐怖耀鸦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啸澡,我是刑警寧澤袖订,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站嗅虏,受9級(jí)特大地震影響洛姑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皮服,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一吏口、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冰更,春花似錦产徊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奠衔,卻和暖如春谆刨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背归斤。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來泰國打工痊夭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脏里。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓她我,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子番舆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

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