亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

史上最全的AJAX之XMLHttpRequest方法和屬性詳解

2024-04-27 15:06:16
字體:
來源:轉載
供稿:網友

轉載請標明出處

本文出自HCY的博客

概述

Ajax是“Asynchronous javascript And xml”的縮寫,中文譯作“異步Javascript和XML”。使用AJAX可以通過HTTP協議與服務器交互數據,可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。 傳統的網頁如果需要更新內容,必須重新加載整個網頁頁面。此外,它也是實現前端與后端解耦的重要技術手段。

為了實現AJAX技術,早期微軟的IE5、IE6瀏覽器內嵌了xmlhttp組件,其它瀏覽器比如Opera、Mozila的早期版本則內嵌了XMLHttPRequest組件。XMLHTTP與XMLHttpRequest有很多相同的屬性和方法,因此XMLHTTP也被一起叫做XMLHttpRequest,簡稱XHR。后來XHR被W3C組織標準化。各瀏覽器也逐漸按照W3C制定的標準來實現XHR,到目前為止,仍然有部分的屬性和方法不被部分瀏覽器支持。下面的圖片截取于 Can I Use網站,它描述了目前各瀏覽器對XHR的兼容情況。因此,在使用XHR開發時需要注意兼容性,不過筆者認為,老版本瀏覽器的占有量會越來越少,新版本的瀏覽器可能會更加嚴格的按照W3C制定的標準來實現XHR,兼容性問題就會被慢慢淡化,Jquery框架在2.2的版本在實例化XHR時就不考慮IE5、IE6的兼容性問題了。

各瀏覽器對XMLHttpRequest的兼容情況

XHR實例的創建

為了實現兼容IE5、IE6瀏覽器版本,所以可以用下面的代碼創建XHR實例。

var xhr;if (window.XMLHttpRequest){ // IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼 xhr=new XMLHttpRequest();}else{ // IE6, IE5 瀏覽器執行代碼 xhr=new ActiveXObject("Microsoft.XMLHTTP");}

XHR請求

XHR可以通過HTTP協議與服務器交換數據,要發送HTTP請求要使用到下面這些方法和屬性:

open方法

open方法用于創建HTTP請求,但是請求并未發送,其定義如下:

open(method, url [, async = true [, username = null [, passWord = null]]])參數method定義請求的類型,如GET、POST方法等等,大小寫不敏感參數url定義請求的URL地址參數async定義是否異步處理請求,true(異步)或者false(同步),默認為true參數username定義用戶名,不常用,默認為null參數password定義密碼,不常用,默認為null

setRequestHeader方法

setRequestHeader方法用于向請求添加HTTP頭,其定義如下:

setRequestHeader(name, value)參數name定義HTTP請求頭部的名稱參數value定義HTTP請求頭部的值

注意: 1. setRequestHeader方法必須在open方法調用之后、send方法之前調用,否則會出現異常 2. setRequestHeader方法可以連續調用多次,如果已經存在同名的HTTP頭時,最終結果是追加而不是覆蓋

//例子1client.setRequestHeader('X-Test', 'one');client.setRequestHeader('X-Test', 'two');//最后的結果為X-Test: one, two//例子2client.setRequestHeader('X-Test', 'one');client.setRequestHeader('X-Test', 'one');//最后的結果為X-Test: one, one

timeout屬性

timeout屬性用于設置HTTP請求的超時時間,單位毫秒。當發生超時時,會觸發ontimeout事件。在IE中,超時屬性只能在調用 open() 方法之后且在調用 send() 方法之前設置。

upload屬性

upload用于在數據傳輸到服務器時收集一些傳輸信息,比如上傳了多少字節,總共多少字節等,其里面還包含了一些事件回調。

send方法

send方法用于發送open方法創建的HTTP請求,其定義如下:

send([body = null])參數body定義HTTP請求的數據,當HTTP請求的方法為GET、HEAD時,該參數被忽略。body的類型可以為ArrayBuffer(二進制緩沖數組)、Blob(二進制大對象)、Document(類似XML格式的數據)、DOMString(字符串)、FormData(表單)。

上面幾種數據類型的介紹可參考:

ArrayBuffer、Blob、Document、DOMString、FormData類型的數據介紹

abort方法

當請求發送后如果想終止這個請求,則可以調用abort方法,其定義如下:

abort()

XHR事件回調

當XHR發送異步請求后,我們無法知道請求是否發生了異常、請求何時到達服務器、服務器何時返回響應數據。XHR為我們提供了很多的事件回調,用來通知我們請求及響應狀態的改變。下面的接口定義語言描述了跟XHR相關的事件接口定義。

interface XMLHttpRequestEventTarget : EventTarget { // event handlers attribute EventHandler onloadstart; attribute EventHandler onprogress; attribute EventHandler onabort; attribute EventHandler onerror; attribute EventHandler onload; attribute EventHandler ontimeout; attribute EventHandler onloadend;};interface XMLHttpRequestUpload : XMLHttpRequestEventTarget {};interface XMLHttpRequest : XMLHttpRequestEventTarget { // event handler attribute EventHandler onreadystatechange; // states //XHR的狀態定義 const unsigned short UNSENT = 0; const unsigned short OPENED = 1; const unsigned short HEADERS_RECEIVED = 2; const unsigned short LOADING = 3; const unsigned short DONE = 4; //用于描述XHR的狀態 readonly attribute unsigned short readyState; // request [SameObject] readonly attribute XMLHttpRequestUpload upload;};readyState屬性用于描述XHR的狀態,它有下面五種狀態:
狀態 描述
0 UNSENT 最初始狀態,還未調用open方法
1 OPENED 已經調用了open方法
2 HEADERS_RECEIVED 已經調用了send方法,響應的HTTP頭部和狀態可以獲取
3 LOADING 正在下載數據,下載的數據還不完整
4 DONE 數據下載完成

- onreadystatechange屬性可以指定一個回調函數,當XHR的狀態(即readyState)發生改變時就會調用該函數,可以在這個回調函數中判斷請求是否成功。

xhr.onreadystatechange = function() { if (xhr.readyState == 4) { //當XHR的狀態為4時判斷請求成功與否,然后處理響應的數據,雖然當XHR的狀態為2或者3時可以獲取到響應狀態,但是此時的數據還未下載完全,不能處理響應數據 if (xhr.status == 200) { //請求成功,處理響應數據 } else { //請求失敗 } } }upload屬性代表上傳數據的過程,它是XMLHttpRequestUpload的實例,XMLHttpRequestUpload繼承XMLHttpRequestEventTarget接口,XMLHttpRequestEventTarget有7個回調方法,在數據上傳的過程中會調用相應的方法。XHR也繼承XMLHttpRequestEventTarget接口,因此它也擁有這些回調方法,但是它的回調方法大多都是從服務器下載響應數據的過程中觸發的。

事件觸發的時機

upload的回調方法會在數據上傳的過程中觸發,XHR的回調方法大多在響應數據下載的過程中觸發,具體的觸發時機見下表:

事件 觸發時機
onreadystatechange 當readyState的值改變時觸發,除了當它從非0變成0時
onloadstart 當調用send方法時會觸發xhr.onloadstart,然后會觸發xhr.upload.onloadstart,代表開始上傳數據
onprogress 上傳數據過程中會觸發xhr.upload.onprogress,下載數據過程中會觸發xhr.onprogress,onprogress每50ms會觸發一次
onabort 調用abort方法后會觸發
onerror 當發生網絡異常的時候會觸發,如果上傳數據的過程還未結束,此時會先觸發xhr.upload.onerror,然后再觸發xhr.onerror;如果上傳數據的過程已經結束,此時只會觸發xhr.onerror
onload 上傳數據成功,會觸發xhr.upload.onload;下載數據成功會觸發xhr.onload
ontimeout 當服務端響應的時間超過指定的timeout時間時,會觸發此事件
onloadend 上傳數據完成(成功或者失?。r會觸發xhr.upload.onloadend;下載數據完成(成功或失?。|發xhr.onloadend

事件觸發的順序

通過下面的代碼驗證,可以得出事件觸發的順序。

var xhr = new XMLHttpRequest(); xhr.timeout = 1; //xhr events xhr.onreadystatechange = function() { console.log("onreadystatechange(),readyState=" + xhr.readyState); } xhr.onloadstart = function(event) { console.log("onloadstart()"); } xhr.onprogress = function(event) { console.log("onprogress()"); } xhr.onabort = function(event) { console.log("onabort()"); } xhr.onerror = function(event) { console.log("onerror()"); } xhr.onload = function(event) { console.log("onload()"); } xhr.ontimeout = function(event) { console.log("ontimeout()"); } xhr.onloadend = function(event) { console.log("onloadend()"); } //upload events xhr.upload.onloadstart = function(event) { console.log("upload.onloadstart()"); } xhr.upload.onprogress = function(event) { console.log("upload.onprogress()"); } xhr.upload.onabort = function(event) { console.log("upload.onabort()"); } xhr.upload.onerror = function(event) { console.log("upload.onerror()"); } xhr.upload.onload = function(event) { console.log("upload.onload()"); } xhr.upload.ontimeout = function(event) { console.log("upload.ontimeout()"); } xhr.upload.onloadend = function(event) { console.log("upload.onloadend()"); } try { xhr.open("POST", "http://localhost:8080/Server/test", true); xhr.send("hello"); } catch (e) { alert(e.toString()); }

打印的順序如下:

//調用了open方法onreadystatechange(),readyState=1//調用了send方法onloadstart()//上傳數據過程中的事件回調upload.onloadstart()//開始上傳請求數據upload.onprogress()//正在上傳請求數據upload.onload()//成功上傳請求數據upload.onloadend()//完成上傳請求數據//下載響應數據過程中的事件回調onreadystatechange(),readyState=2//已經獲取到響應頭部和響應狀態碼onreadystatechange(),readyState=3//正在下載響應數據,改變狀態onprogress()//正在下載響應數據onreadystatechange(),readyState=4//響應數據下載完成,改變狀態onload()//成功下載響應數據onloadend()//完成下載響應數據

事件回調方法的參數

XMLHttpRequestEventTarget里面的回調方法的參數類型為ProgressEvent,ProgressEvent的定義如下:

interface ProgressEvent : Event { readonly attribute boolean lengthComputable;//數據長度是否可計算的 readonly attribute unsigned long long loaded;//已經下載或者上傳了多少字節 readonly attribute unsigned long long total;//需要下載或者上傳的總字節數};

所以在onprogress方法回調中,可以通過loaded和total這兩個屬性來實現上傳或者下載的進度條功能。

事件回調方法的添加方式

一種方式是直接為它指定函數的引用,如下方式: xhr.onloadstart = function(event) { console.log("onloadstart()"); }從上面的定義中可以看出,事件接口都繼承自EventTarget,EventTarget的定義如下,其中有addEventListener方法,第一個參數時事件名稱,沒有“on”前綴,第二個參數時回調方法,其它參數為可選。interface EventTarget { void addEventListener(DOMString type, EventListener? callback, optional (AddEventListenerOptions or boolean) options); void removeEventListener(DOMString type, EventListener? callback, optional (EventListenerOptions or boolean) options); boolean dispatchEvent(Event event);};

因此下面的代碼實現的效果與方式一相同

xhr.addEventListener("loadstart", function(event) { console.log("loadstart()"); });

XHR響應

了解了XHR的請求、XHR的事件回調之后,就剩下處理XHR響應的工作了,比如解析數據等等,要處理響應,需要了解下面的方法和屬性。

getResponseHeader方法

getResponseHeader方法可以獲取HTTP響應頭指定鍵值的數據,其定義如下:

getResponseHeader(ByteString name);參數name為HTTP響應頭部的鍵值

getAllResponseHeaders方法

getAllResponseHeaders方法可以獲取所有的HTTP響應頭的數據,其定義如下:

getAllResponseHeaders()

status和statusText屬性

status屬性表示HTTP響應狀態碼,即200、404等;statusText屬性表示HTTP響應狀態的描述文本,即OK、Not Found等。

responseType、response、responseText、responseXML屬性

可以在發送請求之前設置responseType,用于指定返回的響應數據的類型,responseType的類型有以下幾種:

類型 描述
empty string 空字符串,這是默認值
arraybuffer 二進制緩沖數組
blob 二進制大對象
document 文檔類型
json JSON類型
text 文本類型

處理響應數據時,需要根據responseType來判斷返回的數據類型。當responseType為text或者empty string類型時可以使用responseText屬性,為其它類型時調用responseText會發生異常;當responseType為document或者empty responseXML屬性,為其它類型時調用responseXML會發生異常;當responseType不是empty string、text、document類型時,需要轉換成具體的類型進行解析。

處理響應數據的時機

方式一: xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { //處理數據 } else { //其它操作 } } }方式二: xhr.onload = function(event) { if (xhr.status === 200) { //處理數據 } else { //其它操作 } }

通過XHR回調事件的觸發時機我們可以知道,onreadystatechange回調會觸發多次,因此方式二更優。

參考資料

原汁原味的官方規范,W3C制定的XHR規范發送數據的類型詳解,DOMString、Document、FormData、Blob、File、ArrayBuffer數據類型介紹輔助閱讀的規范文檔,MDN的Web api

更多

掃一掃關注我的公眾號。

這里寫圖片描述


上一篇:前端要點

下一篇:web前端開發語言介紹

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品最新| 中文字幕亚洲综合久久| 欧美成人免费va影院高清| 色综合久综合久久综合久鬼88| 日韩av综合网| 91欧美精品午夜性色福利在线| 欧美巨猛xxxx猛交黑人97人| 久久九九热免费视频| 成人福利视频在线观看| 性欧美长视频免费观看不卡| 91日韩在线播放| 欧美日韩综合视频| 97国产精品久久| 欧美电影在线观看| 亚洲欧美中文日韩v在线观看| 亚洲国产成人在线播放| 亚洲国产日韩欧美在线99| 久久久久久九九九| 亚洲欧美日韩中文在线| 久久精品99久久久久久久久| 欧美午夜精品久久久久久久| 亚洲精品久久久久久久久久久久| 色99之美女主播在线视频| 亚洲男人天堂网站| 国产精品综合久久久| 日韩精品视频在线播放| 欧洲日本亚洲国产区| 久久中文字幕在线视频| 欧美中文字幕在线| 久久久国产精彩视频美女艺术照福利| 日韩一级裸体免费视频| 久久精品国产精品亚洲| 国产亚洲精品久久久久久| 欧美在线一级视频| 日韩免费精品视频| 日韩在线小视频| 欧美一区二区三区……| 亚洲欧美日韩高清| 亚洲成人激情图| 国产精品xxxxx| 69久久夜色精品国产69| 热re91久久精品国99热蜜臀| 精品无人区太爽高潮在线播放| 亚洲欧美另类国产| 国产精品96久久久久久又黄又硬| 日韩欧美a级成人黄色| 免费99精品国产自在在线| 国产性色av一区二区| 亚洲精品有码在线| 欧美激情在线观看| 日韩一二三在线视频播| 2020欧美日韩在线视频| 亚洲级视频在线观看免费1级| 亚洲第一福利网| 国产精品99导航| 欧美精品日韩www.p站| 最新国产成人av网站网址麻豆| 日韩av黄色在线观看| 亚洲精品免费在线视频| 欧美夫妻性生活xx| 欧美一级免费视频| 国产精品美女主播在线观看纯欲| 91福利视频在线观看| 97视频在线观看免费| 国产91在线播放精品91| 欧美第一页在线| 亚洲综合国产精品| 国产欧美日韩亚洲精品| 国产欧美一区二区三区四区| 久久视频免费在线播放| 久久视频在线免费观看| 精品调教chinesegay| 另类图片亚洲另类| 高清欧美性猛交| 亚洲精品成人网| 国产精品稀缺呦系列在线| **欧美日韩vr在线| 欧美日韩亚洲一区二区| 日韩免费av一区二区| 国产www精品| 久久亚洲精品一区二区| 日韩一区二区福利| 在线视频精品一| 国产亚洲欧美aaaa| 午夜精品在线视频| 91免费精品国偷自产在线| 亚洲欧洲午夜一线一品| 国产日韩换脸av一区在线观看| 69影院欧美专区视频| 亚洲综合日韩在线| 狠狠躁夜夜躁人人爽天天天天97| 一夜七次郎国产精品亚洲| 欧美做受高潮电影o| 日韩av最新在线| 欧洲s码亚洲m码精品一区| 亚洲视频欧美视频| 国产欧美日韩视频| 国产中文字幕亚洲| 国产免费一区二区三区在线观看| 亚洲 日韩 国产第一| 57pao成人国产永久免费| 97福利一区二区| 久久久精品国产网站| 亚洲欧洲一区二区三区在线观看| 日本久久久a级免费| 中文一区二区视频| 日韩av影院在线观看| 亚洲成**性毛茸茸| 亚洲第一区中文字幕| 在线电影中文日韩| 综合欧美国产视频二区| 欧美日本在线视频中文字字幕| 久久久av亚洲男天堂| 5278欧美一区二区三区| 日韩亚洲欧美中文高清在线| 国产又爽又黄的激情精品视频| 亚洲娇小xxxx欧美娇小| 久久999免费视频| 欧洲午夜精品久久久| 成人在线视频福利| 中文字幕亚洲二区| 日韩av在线一区二区| 欧美亚洲国产另类| 亚洲小视频在线| 久久中文精品视频| 国产精品爽黄69天堂a| 欧美中文字幕在线播放| 国产成人精品久久二区二区| 国产福利精品av综合导导航| 欧美日韩福利在线观看| 九九热精品视频在线播放| 国产美女被下药99| 91在线观看免费高清| 国产精品精品视频一区二区三区| 欧美精品videos另类日本| 亚洲高清福利视频| 国产精品久久久久久久午夜| 日韩欧美一区二区三区| 欧美在线免费视频| 综合国产在线视频| 尤物九九久久国产精品的特点| 日韩视频在线免费观看| 欧美激情亚洲国产| 成人免费午夜电影| 欧美最顶级丰满的aⅴ艳星| 国产亚洲精品va在线观看| 欧美一区二粉嫩精品国产一线天| 日韩精品高清在线| 亚洲天堂av在线免费观看| 免费99精品国产自在在线| 一本久久综合亚洲鲁鲁| 97不卡在线视频| 国产精品中文字幕在线| 欧美日韩一区二区免费视频| 国产精品一区二区av影院萌芽| 日韩男女性生活视频| 国产精品电影在线观看| 91九色国产在线| 国产精品美女免费看| 91美女片黄在线观看游戏| 日本欧美精品在线| 欧美精品情趣视频| 国产亚洲免费的视频看| 伊人久久久久久久久久久久久|