成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

XMLHTTPRequest屬性、方法、事件大全&詳解。

roadtogeek / 2511人閱讀

摘要:屬性方法事件整理大全。有嚴(yán)格安全限制。值描述將設(shè)為空字符串與設(shè)置為相同,是默認(rèn)類型實(shí)際上是。默認(rèn)值為空字符串只有當(dāng)為時(shí),對(duì)象上才有此屬性,此時(shí)才能調(diào)用,否則拋錯(cuò)。以下種情況下值都為空字符串請(qǐng)求未完成請(qǐng)求失敗。

XMLHTTPRequest屬性、方法、事件整理大全。

xhr 對(duì)象的方法

open(method:string, url:string, async?:boolean=true, username?:string, password: string)

用于創(chuàng)建 HTTP 請(qǐng)求,但請(qǐng)求并未發(fā)送。

method, 請(qǐng)求類型,如 GET 、POST 等,大小寫不敏感。

url, URL 地址

async, 是否異步,默認(rèn) true。
若為同步請(qǐng)求時(shí)

xhr.timeout值必須為 0。

xhr.withCredentials值必須為 false。

xhr.responseType值必須為"",(text 也不允許)。

username, 用戶名,一般不用。

password, 密碼,一般不用。

send(body?:Object=null)

定義 HTTP 請(qǐng)求的數(shù)據(jù)( body ),當(dāng) methodGETHEAD 時(shí),該參數(shù)忽略。body 可為 ArrayBufferBlob、Document(類似 XML 格式數(shù)據(jù))、DOMString(字符串)、FormData(表單)。
ArrayBuffer、Blob、Document、DOMString、Formdata 詳細(xì)參考。
注意:body 參數(shù)會(huì)影響請(qǐng)求頭部的 content-type 默認(rèn)值。

如果 dataDocument 類型,同時(shí)也是 HTML Document 類型,則 content-type 默認(rèn)值為 text/html;charset=UTF-8 ;否則為 application/xml;charset=UTF-8;

如果 dataDOMString 類型,content-type 默認(rèn)值為 text/plain;charset=UTF-8

如果 dataFormData 類型,content-type 默認(rèn)值為 multipart/form-data; boundary=[xxx]

如果 data 是其他類型,則不會(huì)設(shè)置 content-type 的默認(rèn)值

如果用 xhr.setRequestHeader()手動(dòng)設(shè)置了中 content-type 的值,以上默認(rèn)值就會(huì)被覆蓋。
若在斷網(wǎng)狀態(tài)下調(diào)用 xhr.send(data)方法,則會(huì)拋錯(cuò):Uncaught NetworkError: Failed to execute "send" on "XMLHttpRequest"。一旦程序拋出錯(cuò)誤,如果不 catch 就無(wú)法繼續(xù)執(zhí)行后面的代碼,所以調(diào)用 xhr.send(data)方法時(shí),應(yīng)該用 try-catch 捕捉錯(cuò)誤。

try{
    xhr.send(data)
}catch(e) {
    //doSomething...
};

abort()

若請(qǐng)求已發(fā)出,則會(huì)終止請(qǐng)求,并將 readyState 置為 0.

調(diào)用后,應(yīng)將 xhr 對(duì)象置為 null 以促進(jìn)垃圾回收。由于內(nèi)存原因,不建議重用 xhr 對(duì)象。
擴(kuò)展閱讀:和瀏覽器異步請(qǐng)求取消相關(guān)的那些事

overrideMimeType(type:string)
重寫 response 的 content-type。功能如同 xhr.responseType,已可以摒棄。

setRequestHeader(header:string, value:string)

設(shè)置請(qǐng)求 HTTP 請(qǐng)求頭信息。如content-type、cookieaccept-xxx等。

header 參數(shù)大小寫不敏感。

必須在open()方法后,send()方法前調(diào)用,否則會(huì)拋錯(cuò)。

可調(diào)用多次,最終值不會(huì)覆蓋,而是采用追加append方式。

禁止設(shè)置以下請(qǐng)求頭,否則會(huì)拋錯(cuò)。

Accept-Charset

Accept-Encoding

Access-Control-Request-Headers

Access-Control-Request-Method

Connection

Content-Length

Cookie

Cookie2

Date

DNT

Expect

Host

Keep-Alive

Origin

Referer

TE

Trailer

Transfer-Encoding

Upgrade

User-Agent

Via

getResponseHeader(header:string)

獲取某個(gè)指定 header 字段的值。

header 字段不區(qū)分大小寫。

有嚴(yán)格安全限制,詳見getAllResponseHeaders方法。

getAllResponseHeaders()

獲取 response 中所有 header 字段。

有嚴(yán)格安全限制。如下:

無(wú)論跨域或同域請(qǐng)求,無(wú)法獲取Set-Cookie、Set-Cookie2字段值。

跨域請(qǐng)求,只可獲取simple response headerAccess-Control-Expose-Headers(名詞解釋見下方),否則會(huì)報(bào)錯(cuò):Refused to get unsafe header。故若想訪問(wèn)其他字段,需后端添加到 Access-Control-Expose-Headers 中。

simple response header 包括的 header 字段有:Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma。

> `Access-Control-Expose-Headers`:跨域請(qǐng)求獨(dú)有,同域請(qǐng)求無(wú)。該字段中列舉的 `header` 字段為服務(wù)器允許暴露給客戶端訪問(wèn)的字段。
> 句法:```Access-Control-Expose-Headers: , , ...```
xhr 的屬性

readyState
[只讀屬性]用于追蹤 xhr 當(dāng)前的狀態(tài),共有 5 種可能的值,分別對(duì)應(yīng) xhr不同的階段。
每次 readyState 值變化時(shí),都會(huì)觸發(fā) xhr.onreadystatechange 事件。

狀態(tài) 描述
0 UNSENT (初始狀態(tài),未打開) 此時(shí) xhr 對(duì)象被成功構(gòu)造, open() 方法還未被調(diào)用
1 OPENED (已打開,未發(fā)送) open() 方法已被成功調(diào)用,send() 方法還未被調(diào)用。注意:只有 xhr 處于 OPENED 狀態(tài),才能調(diào)用 xhr.setRequestHeader()xhr.send() ,否則會(huì)報(bào)錯(cuò)
2 HEADERS_RECEIVED (已獲取響應(yīng)頭) send() 方法已經(jīng)被調(diào)用, 響應(yīng)頭和響應(yīng)狀態(tài)已經(jīng)返回
3 LOADING (正在下載響應(yīng)體) 響應(yīng)體( response entity body )正在下載中,此狀態(tài)下 xhr.response 可能已經(jīng)有了響應(yīng)數(shù)據(jù)
4 DONE (整個(gè)數(shù)據(jù)傳輸過(guò)程結(jié)束) 整個(gè)數(shù)據(jù)傳輸過(guò)程結(jié)束,不管本次請(qǐng)求是成功還是失敗

statusstatusText
status 屬性表示 HTTP 響應(yīng)狀態(tài)碼,如 200302、400等。
statusText 屬性表示 HTTP響應(yīng)狀態(tài)的描述文本,如 OK、Not Found等。
注意,在 xhr.onload 事件中,不能簡(jiǎn)單的判斷 xhr.status === 200,因?yàn)?20x、304HTTP 狀態(tài)碼也被認(rèn)為是請(qǐng)求成功。
參考以下代碼:

  xhr.onload = function () {
  //如果請(qǐng)求成功
  if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
    //do successCallback
  }
}

responseTyperesponse
可在 xhr.send() 前設(shè)置 responseType ,用于指定返回的響應(yīng)數(shù)據(jù)類型。和 xhr.overrideMimeType() 方法效果相同,推薦使用 responseType

IE10/IE11 不支持 xhr.responseTypejson。

部分瀏覽器不支持 xhr.responseTypeblob。

描述
"" responseType 設(shè)為空字符串與設(shè)置為 text 相同, 是默認(rèn)類型 (實(shí)際上是 DOMString )。
arraybuffer response 是一個(gè)包含二進(jìn)制數(shù)據(jù)的 JavaScript ArrayBuffer 。
blob response 是一個(gè)包含二進(jìn)制數(shù)據(jù)的 Blob 對(duì)象 。
document response 是一個(gè) HTML DocumentXML XMLDocument ,這取決于接收到的數(shù)據(jù)的 MIME 類型。使用 XHR 獲取 HTML 請(qǐng)參閱 HTML in XMLHttpRequest 。
json response 是一個(gè) JavaScript 對(duì)象。這個(gè)對(duì)象是通過(guò)將接收到的數(shù)據(jù)類型視為 JSON 解析得到的。
text response 是包含在 DOMString 對(duì)象中的文本。
moz-chunked-arraybuffer arraybuffer 相似,但是數(shù)據(jù)會(huì)被接收到一個(gè)流中。使用此響應(yīng)類型時(shí),響應(yīng)中的值僅在 progress 事件的處理程序中可用,并且只包含上一次響應(yīng) progress 事件以后收到的數(shù)據(jù),而不是自請(qǐng)求發(fā)送以來(lái)收到的所有數(shù)據(jù)。在 progress 事件處理時(shí)訪問(wèn) response 將返回到目前為止收到的數(shù)據(jù)。在 progress 事件處理程序之外訪問(wèn), response 的值會(huì)始終為 null 。
ms-stream response 是下載流的一部分;此響應(yīng)類型僅允許下載請(qǐng)求,僅 IE 支持。

responseText

默認(rèn)值為空字符串 ""

只有當(dāng) responseTypetext""時(shí),xhr 對(duì)象上才有此屬性,此時(shí)才能調(diào)用 xhr.responseText ,否則拋錯(cuò)。

只有當(dāng)請(qǐng)求成功時(shí),才能拿到正確值。以下 2 種情況下值都為空字符串 "":請(qǐng)求未完成、請(qǐng)求失敗。

responseXML

默認(rèn)值為 null

只有當(dāng) responseTypetext、""、document時(shí),xhr 對(duì)象上才有此屬性,此時(shí)才能調(diào)用 xhr.responseXML,否則拋錯(cuò)。

只有當(dāng)請(qǐng)求成功且返回?cái)?shù)據(jù)被正確解析時(shí),才能拿到正確值。以下 3 種情況下值都為 null :請(qǐng)求未完成、請(qǐng)求失敗、請(qǐng)求成功但返回?cái)?shù)據(jù)無(wú)法被正確解析時(shí)。

upload

是一個(gè)XMLHttpRequestUpload對(duì)象,用于收集傳輸信息。支持事件:

onloadstart

onprogress

onabort

ontimeout

onerror

onload

onloadend
具體觸發(fā)順序及條件,參考事件章節(jié)。
其中,xhr.upload.onprogress在上傳階段(即xhr.send()之后,xhr.readystate=2之前)觸發(fā),每 50ms 觸發(fā)一次??色@得上傳信息、進(jìn)度等。
上述事件回調(diào)的參數(shù)為 XMLHttpRequestEventTarget 對(duì)象,詳見 事件補(bǔ)充。

timeout

單位毫秒,默認(rèn)值 0 ,即不設(shè)置超時(shí)。

計(jì)時(shí)從onloadstart 事件觸發(fā)開始(即xhr.send()開始),以onloadend 事件觸發(fā)為結(jié)束。

在 IE 中,只能在調(diào)用open()方法后send()方法前設(shè)置。其他瀏覽器無(wú)此限制,但仍然從xhr.send()方法調(diào)用計(jì)時(shí)。

不能為同步請(qǐng)求設(shè)置 timeout ,否則會(huì)報(bào)錯(cuò)。

早期較多瀏覽器不支持,可通過(guò) setTImeOut 實(shí)現(xiàn)。

withCredentials
boolean 類型,默認(rèn)值 false, 用于跨域請(qǐng)求時(shí)將 cookie 加入到 request header

xhr.withCredentialsCORS 什么關(guān)系
我們都知道,在發(fā)同域請(qǐng)求時(shí),瀏覽器會(huì)將 cookie 自動(dòng)加在 request header 中。但在發(fā)送跨域請(qǐng)求時(shí), cookie 并不會(huì)自動(dòng)加在 request header 中。
造成這個(gè)問(wèn)題的原因:在 CORS 標(biāo)準(zhǔn)有如下規(guī)定,默認(rèn)情況下,瀏覽器在發(fā)送跨域請(qǐng)求時(shí),不能發(fā)送任何認(rèn)證信息(credentials)如 cookiesHTTP authentication schemes 。除非 xhr.withCredentialstrue
cookies 也是一種認(rèn)證信息,在跨域請(qǐng)求中, client 端必須手動(dòng)設(shè)置 xhr.withCredentials=true ,且 server 端也必須允許 request 能攜帶認(rèn)證信息(即 response header 中包含 Access-Control-Allow-Credentials:true),這樣瀏覽器才會(huì)自動(dòng)將 cookie 加在 request header 中。
注意,一旦跨域 request 能夠攜帶認(rèn)證信息, server 端一定不能將 Access-Control-Allow-Origin 設(shè)置為*,而必須設(shè)置為請(qǐng)求頁(yè)面的域名。

xhr 的事件回調(diào)

xhr 共有 8 個(gè)事件,分別如下:

onloadstart

onprogress

onabort

ontimeout

onerror

onload

onloadend

onreadystatechange

事件觸發(fā)條件
引用自 你真的會(huì)使用 XMLHttpRequest 嗎?
事件 觸發(fā)條件
onreadystatechange 每當(dāng)xhr.readyState改變時(shí)觸發(fā);但xhr.readyState由非 0 值變?yōu)?0 時(shí)不觸發(fā)。
onloadstart 調(diào)用xhr.send()方法后立即觸發(fā),若xhr.send()未被調(diào)用則不會(huì)觸發(fā)此事件。
onprogress xhr.upload.onprogress在上傳階段(即xhr.send()之后,xhr.readystate=2之前)觸發(fā),每 50ms 觸發(fā)一次;xhr.onprogress在下載階段(即xhr.readystate=3時(shí))觸發(fā),每 50ms 觸發(fā)一次。
onload 當(dāng)請(qǐng)求成功完成時(shí)觸發(fā),此時(shí)xhr.readystate=4
onloadend 當(dāng)請(qǐng)求結(jié)束(包括請(qǐng)求成功和請(qǐng)求失?。r(shí)觸發(fā)
onabort 當(dāng)調(diào)用xhr.abort()后觸發(fā)
ontimeout xhr.timeout不等于 0 ,由請(qǐng)求開始即 onloadstart 開始算起,當(dāng)?shù)竭_(dá)xhr.timeout 所設(shè)置時(shí)間請(qǐng)求還未結(jié)束即 onloadend ,則觸發(fā)此事件。
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.statusCode4xx 時(shí),并不屬于 Network error ,所以不會(huì)觸發(fā) onerror 事件,而是會(huì)觸發(fā) onload 事件。
請(qǐng)求正常時(shí),事件觸發(fā)順序

觸發(fā) xhr.onreadystatechange (之后每次 readyState 變化時(shí),都會(huì)觸發(fā)一次)

觸發(fā) xhr.onloadstart //上傳階段開始:

觸發(fā) xhr.upload.onloadstart

觸發(fā) xhr.upload.onprogress

觸發(fā) xhr.upload.onload

觸發(fā) xhr.upload.onloadend //上傳結(jié)束,下載階段開始:

觸發(fā) xhr.onprogress

觸發(fā) xhr.onload

觸發(fā) xhr.onloadend

發(fā)生 abort / timeout / error 時(shí)事件觸發(fā)順序

觸發(fā) xhr.onreadystatechange 事件,此時(shí) readystate4

如果上傳階段還沒有結(jié)束,則依次觸發(fā)以下事件:

xhr.upload.onprogress

xhr.upload.[onabort或ontimeout或onerror]

xhr.upload.onloadend

觸發(fā) xhr.onprogress 事件

觸發(fā) xhr.[onabort或ontimeout或onerror] 事件

觸發(fā) xhr.onloadend 事件

事件補(bǔ)充

xhr.upload.onprogressxhr.onprogress 的回調(diào)參數(shù)為 XMLHttpRequestEventTarget 對(duì)象。屬性如下:

lengthComputable
【只讀】,為 boolean值,表示資源是否有可計(jì)算的長(zhǎng)度。

loaded
已接收或已上傳的字節(jié)數(shù)。

total
文件總字節(jié)數(shù)。

xhr.upload.onprogress 事件觸發(fā)于上傳階段,可用于獲取上傳進(jìn)度。

xhr.onprogress 事件觸發(fā)于下載階段,可用于獲取下載進(jìn)度。

后續(xù)補(bǔ)充計(jì)劃

fetchAPI 整理。

jQuery.ajax 的實(shí)現(xiàn)詳解。

axios 的實(shí)現(xiàn)詳解。

參考資料

DOMString、Document、FormData、Blob、File、ArrayBuffer 數(shù)據(jù)類型介紹

你真的會(huì)使用 XMLHttpRequest 嗎?

XMLHttpRequest Level 2 使用指南

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106092.html

相關(guān)文章

  • 前端跨域之原因&amp;&amp;方案&amp;&amp;原理

    摘要:于是乎同源策略應(yīng)運(yùn)而生主要限制在于和無(wú)法讀取。怎么繞過(guò)同源策略首先一般來(lái)說(shuō)協(xié)議和端口造成的跨域問(wèn)題大部分方法是沒有辦法繞過(guò)的。二級(jí)域名是寄存在主域名之下的域名。當(dāng)主域名受到懲罰二級(jí)域名也會(huì)連帶懲罰。 前言 這是一道前端跨不過(guò)躲不掉面試必備的知識(shí),掙扎多年沒能做到刻骨銘心深入脊髓,只能好好寫篇博文記錄起來(lái)了; 什么是跨域? 廣義來(lái)說(shuō),A域執(zhí)行的文檔腳本試圖去請(qǐng)求B域下的資源是不被允許的,...

    Zack 評(píng)論0 收藏0
  • 微信小程序云開發(fā)項(xiàng)目實(shí)戰(zhàn)進(jìn)階 - 詩(shī)詞大全&amp;成語(yǔ)接龍

    摘要:此時(shí),就需要通過(guò)云函數(shù)更新數(shù)據(jù)庫(kù),新建云函數(shù)編輯更新數(shù)據(jù)根據(jù)更新已打開人數(shù)使用云函數(shù)更新某數(shù)據(jù)的打開人數(shù)數(shù)據(jù)庫(kù)模糊查詢小程序云開發(fā)可以使用正則表達(dá)式進(jìn)行模糊查詢。 1. 小程序功能 古詩(shī)詞大全 成語(yǔ)大全 成語(yǔ)接龍 詩(shī)詞飛花令 詩(shī)詞分享、收藏 詩(shī)詞接龍 唐詩(shī)宋詞起名字 百家姓 猜謎語(yǔ) 2. 小程序地址 https://github.com/caochangkui/miniprogra...

    Ku_Andrew 評(píng)論0 收藏0
  • 溫故js系列(12)-ajax&amp;&amp;優(yōu)缺點(diǎn)&amp;&amp;node后端

    摘要:接收響應(yīng)當(dāng)請(qǐng)求發(fā)送到服務(wù)器端,收到響應(yīng)后,響應(yīng)的數(shù)據(jù)會(huì)自動(dòng)填充對(duì)象的屬性。一般而已狀態(tài)代碼為作為成功的標(biāo)志。必要時(shí),可以將查詢字符串參數(shù)追加到的末尾,以便提交給服務(wù)器。后端實(shí)現(xiàn)可以自學(xué)一點(diǎn)后端知識(shí),便于學(xué)習(xí)。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:Ajax JavaScript-Ajax&&no...

    LiangJ 評(píng)論0 收藏0
  • 詳解Vue3 Composition API優(yōu)雅封裝第三方組件

      我們時(shí)常會(huì)想在保持第三方組件原有功能(屬性props、事件events、插槽slots、方法methods)的基礎(chǔ)上,這些功能如何優(yōu)化的實(shí)現(xiàn)?  以Element Plus的el-input為例:  在封裝一個(gè)MyInput組件,把要使用的屬性props、事件events和插槽slots、方法methods先要依照自己的需求來(lái)編寫:  //MyInput.vue   <template&...

    3403771864 評(píng)論0 收藏0
  • 基于 HTTP 請(qǐng)求攔截,快速解決跨域和代理 Mock

    摘要:今天這篇文章,我們會(huì)介紹幾種常見的方法和其中存在的問(wèn)題,并提出如何基于請(qǐng)求攔截,快速解決跨域和代理問(wèn)題的方案。因?yàn)闆]有修改該請(qǐng)求,只是延遲發(fā)送,這樣就保持了原請(qǐng)求與業(yè)務(wù)服務(wù)器之間的所有鑒權(quán)等相關(guān)信息,由此解決了跨域訪問(wèn)無(wú)法攜帶的問(wèn)題。 近幾年,隨著 Web 開發(fā)逐漸成熟,前后端分離的架構(gòu)設(shè)計(jì)越來(lái)越被眾多開發(fā)者認(rèn)可,使得前端和后端可以專注各自的職能,降低溝通成本,提高開發(fā)效率。 在前后端...

    dreamGong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<