原生AJAX以及AJAX基本封裝

AJAX:

XMLHttpRequest是AJAX的基礎(chǔ)
1.創(chuàng)建一個(gè)XMLHttpRequest對(duì)象:
        const xmlhttp;

        if(window.XMLHttpRequest){

          xmlhttp =new XMLHttpRequest();

        }else{

       //針對(duì)IE
        xmlhttp = new ActiveXObject(“Microsoft.XMLHttp”)店茶;
         }
       
2.用XMLHttpRequest向服務(wù)器發(fā)送請(qǐng)求:

首先查看XMLHttpRequest對(duì)象的open()和send()方法

open(method,url,async)
規(guī)定請(qǐng)求的類型、URL以及是否異步請(qǐng)求,如果要用AJAX,要設(shè)置為異步
method:請(qǐng)求的類型,GET朱躺、POST等怎抛。
async:true異步揍拆、false同步

send(string)
將請(qǐng)求發(fā)送到服務(wù)器
string:請(qǐng)求的數(shù)據(jù)拢操,僅用于POST 請(qǐng)求

   //一個(gè)發(fā)送GET請(qǐng)求并且?guī)д?qǐng)求信息的例子:
   //xmlhttp對(duì)象的創(chuàng)建參考上面的例子

   xmlhttp.open("GET","localhost:8080/index.html?a=1&b=2",true);
   xmlhttp.send();

   /*URL中‘锦亦?’之后的部分稱為querystring,&代表請(qǐng)求參數(shù)的分隔符
   上面的例子中發(fā)送了{(lán)a:1,b:2} */

3.像HTML表單那樣POST數(shù)據(jù)

使用setRequestHeader()添加HTTP頭部,然后在send()方法中規(guī)定傳輸?shù)臄?shù)據(jù):

   xmlhttp.open("POST","localhost:8080/index.htm",true);
   xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
   xmlhttp.send("name=bill&age=18");
setRequestHeader(header,value):

向請(qǐng)求添加HTTP頭令境,header規(guī)定頭的名稱杠园,value規(guī)定頭的值。

4.服務(wù)器響應(yīng)事件:
onreadystatechange事件:

當(dāng)請(qǐng)求被發(fā)送到服務(wù)器時(shí)舔庶,我們需要執(zhí)行一些基于響應(yīng)的任務(wù)抛蚁,每當(dāng)readyState改變時(shí),就會(huì)觸發(fā)onreadystatechange事件惕橙,readyState屬性存有XMLHttpRequest的狀態(tài)信息瞧甩。

XMLHttpRequest對(duì)象的重要屬性:
XMLHttpRequest對(duì)象的屬性
readyState與status的具體工作流程:
image.png
status的值可以分為以下幾大類:
  • 1xx:信息處理類,表示接收到請(qǐng)求并且繼續(xù)處理
  • 2xx:處理成功響應(yīng)類弥鹦,表示動(dòng)作被成功接收肚逸,理解和接受
  • 3xx:重定向響應(yīng)類,為了完成指定的動(dòng)作彬坏,必須接受進(jìn)一步處理
  • 4xx:客戶端錯(cuò)誤朦促,客戶請(qǐng)求包含語(yǔ)法錯(cuò)誤或者是不能正確執(zhí)行
  • 5xx:服務(wù)端錯(cuò)誤,服務(wù)器不能正確執(zhí)行一個(gè)正確的請(qǐng)求
在onreadystatechange事件中栓始,我們規(guī)定當(dāng)服務(wù)器已做好被處理的準(zhǔn)備時(shí)所執(zhí)行的任務(wù)务冕。onreadystatechange事件被觸發(fā)五次,對(duì)應(yīng)著readyState的每個(gè)變化幻赚,當(dāng)readyState等于4且狀態(tài)status為200時(shí)禀忆,表示響應(yīng)已經(jīng)就緒:
      xmlhttp.onreadystatechange = function (){
          if (xmlhttp.readyState == 0 ){
            console.log('處于定義XHR但未初始化階段');
          }
         if (xmlhttp.readyState == 1){
            console.log('調(diào)用send()方法正在發(fā)送請(qǐng)求");     
         }
        if (xmlhttp.readyState == 2){
            console.log('載入完成,已經(jīng)接受到全部響應(yīng)內(nèi)容");
        }
        if (xmlhttp.readyState == 3){
            console.log("正在解析收到的內(nèi)容");
        }
        if (xmlhttp.readyState == 4){
            console.log("解析完畢可以返回客戶端應(yīng)用");
        }
        if (xmlhttp.readyState ==4 &&xmlhttp.status ==200){
            console.log("響應(yīng)就緒");
            console.log("響應(yīng)信息",xmlhttp.responseText);
        }
   }

5.封裝XMLHttpRequest

封裝模擬jquery的AJAX請(qǐng)求函數(shù)坯屿,目的是為了減少對(duì)jquery的依賴以及提高代碼的復(fù)用率油湖,使用callback回調(diào)函數(shù)讓onreadystatechange事件執(zhí)行,使得執(zhí)行的任務(wù)可變:

      //@param:requestobj類似于jquery的ajax請(qǐng)求傳入的對(duì)象
      //@param:requestobj.method請(qǐng)求的方式领跛,"GET"\"POST"
      //@param:requestobj.url 請(qǐng)求的URL
      //@param:requestobj.data請(qǐng)求的信息
      //@param:requestobj.header 請(qǐng)求的頭部信息
      //@param:requestobj.success乏德,onreadystatechange事件的回調(diào)

       function ajax( requestobj ){
           requestobj = requestobj || {};
           let method = (requestobj.method == null ?
           "GET" : requestobj.method.toUpperCase());
           let url = requestobj.url || ' ';
           if( url == "" )
           return "url不能為空"
           let data = requestobj.data || null;
           let header = requestobj.header || 'application/x-www-form-unlenconded;charset=utf-8’;
           let callback = requestobj.success;
           let xmlhttp = null;
           if(window.XMLHttpRequest){
                 xmlhttp = new XMLHttpRequest();
           }else{
                xmlhttp = new ActiveObject("Microsoft.XMLHTTP");
           }
          //將對(duì)象轉(zhuǎn)化成為querystring形式
          let paramarray = [ ]; 
          for (key in data ) {
              paramarray.push(key+'='+data[key]);
           }
           let datapost = paramarray.join('&‘’);
           xmlhttp.onreadystatechange = function (){
               if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                      callback(xmlhttp.responseText);
              }
              //可以自行添加其他響應(yīng),例如status == 404的情況等
          };
     
          if(method == "POST"){
                    xmlhttp.open(method,url,true);
                    xmlhttp.setRequestHeader("Content-Type",header);
                    xmlhttp.send(datapost);
           }else if (method == "GET"){
                     xmlhttp.open(method,url+'?'+datapost,true);
                     xmlhttp.setRequestHeader("Content-Type",header);
                     xmlhttp.send();
           }
}
6.其他XMLHttpRequest方法:

abort()方法:取消當(dāng)前響應(yīng)吠昭,關(guān)閉連接并且結(jié)束任何未決的網(wǎng)絡(luò)活動(dòng)喊括。
這個(gè)方法把XMLHttpRequest對(duì)象重置為readyState為0的狀態(tài),并且取消所有未決的網(wǎng)絡(luò)活動(dòng)矢棚,如果響應(yīng)不再必要時(shí)郑什,可以調(diào)用這個(gè)方法.

getAllResponseHeaders():把HTTP響應(yīng)頭部作為未解析的字符串返回。
如果readyState小于3蒲肋,這個(gè)方法返回null蘑拯。否則钝满,它返回服務(wù)器發(fā)送的所有HTTP響應(yīng)的頭部。頭部作為單個(gè)字符串返回申窘,一行一個(gè)頭部弯蚜,每行用換行符“\r\n”隔開。

getResponseHeader():返回置頂?shù)腍TTP響應(yīng)頭部信息剃法,參數(shù)是要返回的HTTP響應(yīng)頭部的名稱碎捺,不區(qū)分大小寫。
如果沒有接受到頭部參數(shù)或者readyState小于3則為空字符串贷洲,如果接受到多個(gè)有指定名稱的頭部收厨,這個(gè)頭部的值被鏈接起來(lái)并返回,使用都好和空格分隔開各個(gè)頭部的值优构。

參考資料:

W3C
AJAX封裝
更全面的AJAX封裝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诵叁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俩块,更是在濱河造成了極大的恐慌黎休,老刑警劉巖浓领,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玉凯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡联贩,警方通過查閱死者的電腦和手機(jī)漫仆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門具滴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蹈垢,“玉大人白粉,你說(shuō)我怎么就攤上這事蒲祈〗钤猓” “怎么了娶眷?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵揩页,是天一觀的道長(zhǎng)来累。 經(jīng)常有香客問我没隘,道長(zhǎng)懂扼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任右蒲,我火速辦了婚禮阀湿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瑰妄。我一直安慰自己陷嘴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布间坐。 她就那樣靜靜地躺著灾挨,像睡著了一般邑退。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劳澄,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天瓜饥,我揣著相機(jī)與錄音,去河邊找鬼浴骂。 笑死乓土,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溯警。 我是一名探鬼主播趣苏,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梯轻!你這毒婦竟也來(lái)了食磕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喳挑,失蹤者是張志新(化名)和其女友劉穎彬伦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伊诵,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡单绑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年搂橙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了区转。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片废离。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宴偿,死狀恐怖窄刘,靈堂內(nèi)的尸體忽然破棺而出娩践,到底是詐尸還是另有隱情烹骨,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響谷遂,放射性物質(zhì)發(fā)生泄漏肾扰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦彻坛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疙渣。三九已至,卻和暖如春懦冰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背内地。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工举农, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留航背,地道東北人玖媚。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓错森,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辰狡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 寫在前面 本篇主要內(nèi)容是結(jié)合“XMLHttpRequest Level 1”規(guī)范和w3school網(wǎng)站中針對(duì)XML...
    JSON_NULL閱讀 1,414評(píng)論 3 9
  • 本文詳細(xì)介紹了 XMLHttpRequest 相關(guān)知識(shí)叫倍,涉及內(nèi)容: AJAX、XMLHTTP豺瘤、XMLHttpReq...
    semlinker閱讀 13,657評(píng)論 2 18
  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對(duì)象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,195評(píng)論 0 7
  • 前言 總括: 本文講解了ajax的歷史吆倦,工作原理以及優(yōu)缺點(diǎn),對(duì)XMLHttpRequest對(duì)象進(jìn)行了詳細(xì)的講解坐求,并...
    秦至閱讀 928評(píng)論 0 19
  • 要完整實(shí)現(xiàn)一個(gè)AJAX異步調(diào)用和局部刷新,通常需要以下幾個(gè)步驟: (1)創(chuàng)建XMLHttpRequest對(duì)象,也就...
    親愛的翔子閱讀 492評(píng)論 0 0