原生AJAX以及AJAX基本封裝

AJAX:

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

        if(window.XMLHttpRequest){

          xmlhttp =new XMLHttpRequest();

        }else{

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

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

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

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

   //一個發(fā)送GET請求并且?guī)д埱笮畔⒌睦?
   //xmlhttp對象的創(chuàng)建參考上面的例子

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

   /*URL中‘?’之后的部分稱為querystring,&代表請求參數(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):

向請求添加HTTP頭,header規(guī)定頭的名稱,value規(guī)定頭的值。

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

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

XMLHttpRequest對象的重要屬性:
XMLHttpRequest對象的屬性
readyState與status的具體工作流程:
image.png
status的值可以分為以下幾大類:
  • 1xx:信息處理類,表示接收到請求并且繼續(xù)處理
  • 2xx:處理成功響應(yīng)類,表示動作被成功接收,理解和接受
  • 3xx:重定向響應(yīng)類,為了完成指定的動作,必須接受進(jìn)一步處理
  • 4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執(zhí)行
  • 5xx:服務(wù)端錯誤,服務(wù)器不能正確執(zhí)行一個正確的請求
在onreadystatechange事件中,我們規(guī)定當(dāng)服務(wù)器已做好被處理的準(zhǔn)備時所執(zhí)行的任務(wù)。onreadystatechange事件被觸發(fā)五次,對應(yīng)著readyState的每個變化,當(dāng)readyState等于4且狀態(tài)status為200時,表示響應(yīng)已經(jīng)就緒:
      xmlhttp.onreadystatechange = function (){
          if (xmlhttp.readyState == 0 ){
            console.log('處于定義XHR但未初始化階段');
          }
         if (xmlhttp.readyState == 1){
            console.log('調(diào)用send()方法正在發(fā)送請求");     
         }
        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請求函數(shù),目的是為了減少對jquery的依賴以及提高代碼的復(fù)用率,使用callback回調(diào)函數(shù)讓onreadystatechange事件執(zhí)行,使得執(zhí)行的任務(wù)可變:

      //@param:requestobj類似于jquery的ajax請求傳入的對象
      //@param:requestobj.method請求的方式,"GET"\"POST"
      //@param:requestobj.url 請求的URL
      //@param:requestobj.data請求的信息
      //@param:requestobj.header 請求的頭部信息
      //@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");
           }
          //將對象轉(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ò)活動。
這個方法把XMLHttpRequest對象重置為readyState為0的狀態(tài),并且取消所有未決的網(wǎng)絡(luò)活動,如果響應(yīng)不再必要時,可以調(diào)用這個方法.

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

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

參考資料:

W3C
AJAX封裝
更全面的AJAX封裝

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

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

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