簡(jiǎn)單的分析下XMLHttpRequest對(duì)象

創(chuàng)建xhr對(duì)象

var xhr = new XMLHttpRequest()

關(guān)于xhr對(duì)象屬性

  • 追蹤xhr發(fā)送ajax的狀態(tài)
    1. xhr.readyState對(duì)象即是當(dāng)前請(qǐng)求對(duì)象的時(shí)時(shí)狀態(tài)
    2. xhr.readyState有四種狀態(tài)
      • 0: open()方法還未被調(diào)用
      • 1: send()方法還未被調(diào)用
      • 2: send()方法已經(jīng)被調(diào)用, 響應(yīng)頭和響應(yīng)狀態(tài)已經(jīng)返回.
      • 3: 響應(yīng)體下載中; responseText中已經(jīng)獲取了部分?jǐn)?shù)據(jù).
      • 4: 整個(gè)請(qǐng)求過(guò)程已經(jīng)完畢.
    3. 通過(guò)上面可以發(fā)現(xiàn),當(dāng)xhr.open()沒有執(zhí)行膳算,打印xhr.readyState即是0,當(dāng)然xhr.send()沒有執(zhí)行,xhr.readyState即是1,如果執(zhí)行了open()和send()那么readyState只可能會(huì)出現(xiàn)24而不會(huì)出現(xiàn)01弛作;
  1. xhr.readyState的每次變化都會(huì)觸發(fā)xhr.onreadystatechange事件

  • 上傳和下載的進(jìn)度條的顯示
    1. xhr的進(jìn)度事件分為上傳xhr.upload.onprogress和下載的xhr.onprogress
    2. 都會(huì)給事件監(jiān)聽函數(shù)傳遞一個(gè)實(shí)參event對(duì)象,event.loaded表示已經(jīng)載入的數(shù)據(jù),event.total表示總共數(shù)量,前提是event. lengthComputable優(yōu)值得情況下才可以涕蜂。
  1. 栗子:
     //下載
      xhr.onprogress = progressHandle
     //上傳
     xhr.upload.onprogress = progressHandle
     
     function progressHandle(e) {
         var e = e || event 
         if(e.lengthComputable) {
             return Math.round(e.loaded / e.total * 100)+'%'
         }
     }
    

  • 指定響應(yīng)的數(shù)據(jù)類型 xhr.responseType
    1. 含義: 就是設(shè)置響應(yīng)數(shù)據(jù)類型,如果后臺(tái)返回的是個(gè)字符串的json,那么前臺(tái)設(shè)置xhr.responseType = 'json',那么自動(dòng)轉(zhuǎn)化成json對(duì)象,而不需要前臺(tái)JSON.parse()去轉(zhuǎn)化了
  1. 可選值:
    • '' : 默認(rèn)就是字符串
    • 'json': 把后臺(tái)的字符串對(duì)象轉(zhuǎn)成json格式,如果后臺(tái)傳的根本不是字符串json或者json,那么前臺(tái)獲取不到,得到的xhr.response為null映琳;
    • 后面的以后再寫吧,天快亮了

  • 獲取response的信息(response, responseText, reponseXML)
    1. 三種屬性都必須等待xhr.status == 200和xhr.readyState == 4才能獲取到值,不然是''或者null和responseType設(shè)的值有關(guān)
    2. xhr.response 會(huì)返回響應(yīng)的數(shù)據(jù)
    3. xhr.responseText 只有當(dāng)responseType = 'text'或者'',才會(huì)有值返回机隙,否則是Null

關(guān)于xhr對(duì)象的方法

  • 設(shè)置請(qǐng)求頭-setRequestHeader(string headerType, string type)
 ??栗子: xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
- headerType:請(qǐng)求頭的鍵,常用的比如'Content-Type',這里其實(shí)是不區(qū)分大小寫的,等同于'content-type';
- type:請(qǐng)求頭的值,web客戶端常用的幾個(gè)分別是multipart/form-data來(lái)上傳圖片等文件適用于type=file,application/x-www-form-urlencoded來(lái)上傳表單數(shù)據(jù)
- xhr.setRequestHeader()方法必須寫在open()之后,send()方法之前,否則會(huì)報(bào)錯(cuò)
- 此方法可多次調(diào)用,如果鍵相同,也不會(huì)覆蓋,則會(huì)累加萨西;

  • 獲取響應(yīng)頭信息
  1. xhr.getResponseHeader(string headerKey),獲取單個(gè)請(qǐng)求頭的信息,必須填寫一個(gè)自定義的請(qǐng)求頭的key(其實(shí)就是chrome控制臺(tái)里面,后臺(tái)返回給前臺(tái)的那些response headers里面的那些你想得到某個(gè)字段)有鹿;
  2. xhr.getAllResponseHeaders(), 獲取所有的響應(yīng)頭的信息,就是chrome控制臺(tái)response headers里面的那些鍵值對(duì)都會(huì)返回谎脯;
  3. 上面兩個(gè)方法并不是獲取到所有的信息,部分安全信息是獲取不到的,比如cookie之類的
  4. 注意:要想獲取到響應(yīng)頭的信息,兩個(gè)方法都必須放在onreadystatechange方法中并且xhr.status === 200和xhr.readyState === 4才能成功獲取到

  • send(data)和可以發(fā)送的數(shù)據(jù)
    1. send(data)中的data可以是以下幾種類型:
    ArrayBuffer
    Blob
    Document
    DOMString
    FormData
    null
    
    1. send(data)中的data類型會(huì)影響request中的Content-type請(qǐng)求類型,如下:
      • Document => text/html;charset=UTF-8
      • Strinf => text/plain;charset=UTF-8
      • FormData => multipart/form-data; boundary=[xxx]
    2. xhr.setRequestHeader會(huì)強(qiáng)制覆蓋這些默認(rèn)值

xhr對(duì)象的事件

  • 事件列表(xhr和xhr.upload都有)

onloadstart
onprogress
onabort
ontimeout
onerror
onload
onloadend

 
- **觸發(fā)條件**
1. onreadystatechange > 每當(dāng)xhr.readyState改變時(shí)觸發(fā);xhr.readyState由非0值變?yōu)?時(shí)不觸發(fā)葱跋。
2. onloadstart > 調(diào)用xhr.send()方法后立即觸發(fā),若xhr.send()未被調(diào)用則不會(huì)觸發(fā)此事件。
3. onprogress > xhr.upload.onprogress在上傳階段(即xhr.send()之后,xhr.readystate=2之前)觸發(fā),每50ms觸發(fā)一次;xhr.onprogress在下載階段(即xhr.readystate=3時(shí))觸發(fā),每50ms觸發(fā)一次源梭。
4.  onload > 當(dāng)請(qǐng)求成功完成時(shí)觸發(fā),此時(shí)xhr.readystate=4
5. onerror > 在請(qǐng)求過(guò)程中,若發(fā)生Network error則會(huì)觸發(fā)此事(若發(fā)生Network error時(shí),上傳還沒有結(jié)束,則會(huì)先觸發(fā)xhr.upload.onerror,再觸發(fā)xhr.onerror;若發(fā)生Network error時(shí),上傳已經(jīng)結(jié)束,則只會(huì)觸發(fā)xhr.onerror. **注意**,只有發(fā)生了網(wǎng)絡(luò)層級(jí)別的異常才會(huì)觸發(fā)此事件,對(duì)于應(yīng)用層級(jí)別的異常,如響應(yīng)返回的xhr.statusCode是4xx
時(shí),并不屬于Network error,所以不會(huì)觸發(fā)onerror
事件,而是會(huì)觸發(fā)onload事件娱俺。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咸产,隨后出現(xiàn)的幾起案子矢否,更是在濱河造成了極大的恐慌,老刑警劉巖脑溢,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件僵朗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屑彻,警方通過(guò)查閱死者的電腦和手機(jī)验庙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)社牲,“玉大人粪薛,你說(shuō)我怎么就攤上這事〔簦” “怎么了违寿?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)熟空。 經(jīng)常有香客問我藤巢,道長(zhǎng),這世上最難降的妖魔是什么息罗? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任掂咒,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绍刮。我一直安慰自己温圆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布孩革。 她就那樣靜靜地躺著岁歉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫉戚。 梳的紋絲不亂的頭發(fā)上刨裆,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音彬檀,去河邊找鬼帆啃。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窍帝,可吹牛的內(nèi)容都是我干的努潘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坤学,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疯坤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起深浮,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤压怠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后飞苇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菌瘫,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年布卡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雨让。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忿等,死狀恐怖栖忠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贸街,我是刑警寧澤庵寞,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站薛匪,受9級(jí)特大地震影響捐川,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛋辈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冷溶,春花似錦渐白、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至苗胀,卻和暖如春襟诸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背基协。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工歌亲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人澜驮。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓陷揪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親杂穷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悍缠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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