国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

20170615-Ajax和XMLHttpRequest

Java3y / 3265人閱讀

摘要:從請求開始算起,若超過時間請求還沒有結束包括成功失敗,則會觸發事件,主動結束該請求。在不限制超時的情況下,有可能同步請求一直處于狀態,服務端遲遲不返回響應,這樣整個頁面就會一直阻塞,無法響應用戶的其他交互。

Ajax和XMLHttpRequest

這篇文章轉發自我之前的一篇博客,是看過《你真的會使用XMLHttpRequest嗎?》后結合自己之前對Ajax認識的總結。

Ajax:"Asynchronous JavaScript And XML"即異步JavaScript和XML,是一種創建交互式網頁應用的網頁開發技術,這項技術的核心是瀏覽器提供的XMLHttpRequest對象。

XMLHttpRequest的使用 1.設置request header void setRequestHeader(headerName, headerValue)

setRequestHeader必須寫在open()方法之后,send()方法之前

2. 獲取response header getAllResponseHeaders()

獲取全部可獲取(有一些header是獲取不到的)的header字段

getResponseHeader(headerName)

獲取指定header字段的值(只能獲取部分header的值)

3. 指定xhr.response的數據類型

通過設置xhr.response的類型,是告訴瀏覽器或者xhr如何處理響應數據(對響應數據按照什么樣的格式去處理)

xhr.overrideMimeType()

這個方法的作用就是重寫response的MIME類型

這個方法必須在send()方法之前進行調用

可以通過這種方式,可以得到純文本格式的圖片內容,獲取到數據后再使用相應的編碼方法重新構建圖片

var xhr = new XMLHtppRequest()
xhr.open("get", "text.php", true)
xhr.overrideMimeType("text/xml; charset=utf-8")
xhr.send();

根據上面的例子,將response的MIME類型設置為了"text/xml",通過這樣的方式,xhr會將響應當做text或者xml來處理,通過xhr.responsexhr.responseText可以獲取到文本格式的相應數據,通過xhr.responseXML可以獲取到XML格式(是一顆DOM樹/DOM對象)的數據

var xhr = new XMLHtppRequest()
xhr.open("get", "text.php", true)
xhr.overrideMimeType("text/plain; charset=utf-8")
xhr.send();

根據上面的例子,將response的MIME類型設置為了"text/plain",通過這樣的方式,xhr會將相應當做text或者plain(純文本)來處理,通過xhr.responsexhr.responseText可以獲取到文本格式的相應數據,通過xhr.responseXML獲取到的數據為null,即便數據是XML

xhr.responseType

responseType是XMLHttpRequest leve2中新增的屬性,用來指定xhr.response的數據類型

var xhr = new XMLHttpRequest();
xhr.open("GET", "/path/to/image.png", true);
//可以將`xhr.responseType`設置為`"blob"`也可以設置為`" arrayBuffer"`
//xhr.responseType = "arrayBuffer";
xhr.responseType = "blob";

xhr.onload = function(e) {
  if (this.status == 200) {
    // this.response就是Blob對象
    var blob = this.response;
    ...
  }
};

xhr.send();
4. 如何獲取response數據

xhr提供了3個屬性來獲取請求返回的數據,分別是:xhr.response, xhr.responseText, xhr.responseXML

xhr.response:

無論xhr.responseType的值是什么,只要請求完成,都可以從xhr.response中取到對應的值

請求未完成時,xhr.response的值與xhr.responseType有關,xhr.responseType的值為""(默認值)或者text時,xhr.response的值為"",否則為null

xhr.responseText:

只有當responseType設置為""或者text時,才可以使用這個屬性獲取相應內容

請求未完成、失敗時,該值為空字符串

xhr.responseXML:

只有當 responseType 為""document時,此時才能調用xhr.responseXML,否則拋錯

請求未完成、失敗時,該值為null

5. 如何追蹤ajax請求的當前狀態

xhr.readyState屬性可以獲取ajax的狀態,每當xhr.readyState的值發生變化時,就會觸發xhr.onreadystatechange事件,可以在這個事件中進行相應的操作

為了保證跨瀏覽器兼容性,必須在調用open()方法之前指定onreadystatechange事件處理程序

 xhr.onreadystatechange = function () {
    switch(xhr.readyState){
      case 1://OPENED
        //do something
            break;
      case 2://HEADERS_RECEIVED
        //do something
        break;
      case 3://LOADING
        //do something
        break;
      case 4://DONE
        //do something
         break;
    }

6. 設置請求的超時時間

XMLHttpRequest提供了timeout屬性來允許設置請求的超時時間。

從請求開始 算起,若超過 timeout 時間請求還沒有結束(包括成功/失敗),則會觸發ontimeout事件,主動結束該請求。

請求開始:xhr.onloadstart事件觸發的時候,也就是你調用xhr.send()方法的時候

請求結束:xhr.loadend事件觸發的時候。

7. 發送同步請求

由open()方法的第三個參數決定,當第三個參數async為true時,發送異步請求,為false時則為同步請求

當xhr為同步請求時,有如下限制:

xhr.timeout必須為0

xhr.withCredentials必須為 false

xhr.responseType必須為""(即默認值)

避免使用同步請求:因為我們無法設置請求超時時間(xhr.timeout為0,即不限時)。在不限制超時的情況下,有可能同步請求一直處于pending狀態,服務端遲遲不返回響應,這樣整個頁面就會一直阻塞,無法響應用戶的其他交互。

8. 如何獲取上傳、下載進度

我們可以通過onprogress事件來實時顯示進度,默認情況下這個事件每50ms觸發一次。需要注意的是,上傳過程和下載過程觸發的是不同對象的onprogress事件:

上傳觸發的是xhr.upload對象的 onprogress事件

下載觸發的是xhr對象的onprogress事件

xhr.onprogress = updateProgress;
xhr.upload.onprogress = updateProgress;
function updateProgress(event) {
    if (event.lengthComputable) {
      var completedPercent = event.loaded / event.total;
    }
 }
xhr相關事件

每一XMLHttpRequest對象都有一個upload屬性,而upload是一個XMLHttpRequestUpload對象.XMLHttpRequest和XMLHttpRequestUpload對象共同擁有上述(除onreadystatechange事件)事件。onreadystatechange是XMLHttpRequest對象獨有的事件

1. 事件觸發順序

觸發xhr.onreadystatechange(之后每次readyState變化時,都會觸發一次)

觸發xhr.onloadstart

上傳階段開始:

觸發xhr.upload.onloadstart

觸發xhr.upload.onprogress

觸發xhr.upload.onload

觸發xhr.upload.onloadend

上傳結束,下載階段開始:

觸發xhr.onprogress

觸發xhr.onload

觸發xhr.onloadend

2. 發生abort/timeout/error異常的處理

一旦發生abort或timeout或error異常,先立即中止當前請求

將 readystate 置為4,并觸發 xhr.onreadystatechange事件

如果上傳階段還沒有結束,則依次觸發以下事件:

xhr.upload.onprogress

xhr.upload.[onabort或ontimeout或onerror]

xhr.upload.onloadend

注意不會觸發onload事件

觸發 xhr.onprogress事件

觸發 xhr.[onabort或ontimeout或onerror]事件

觸發xhr.onloadend 事件

注意不會觸發onload事件

注意: 這時候的xhr.readyState為4,xhr.status為0

3. 在哪個事件中注冊成功回調

從上面介紹的事件中,可以知道若xhr請求成功,就會觸發xhr.onreadystatechange和xhr.onload兩個事件。由于xhr.onreadystatechange是每次xhr.readyState變化時都會觸發,而不是xhr.readyState=4時才觸發(例如發生abort、timeout、error異常,會先終止當前請求,將readyState設置為4,并觸發onreadystatechange事件),因此建議在onload事件中注冊成功回調

xhr.onload = function () {
    //如果請求成功
    if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
      //do successCallback
    }
  }
為什么要對xhr.status進行上述判斷

xhr.status代表相應的HTTP狀態
以2開頭的狀態碼,代表請求已經成功被服務器接收、理解、并接受
狀態代碼304代表請求的資源并沒有修改,可以直接使用瀏覽器中緩存的版本
其他以3開頭的狀態代碼則表示需要客戶端采取進一步的操作才能完成請求。

status和readyState

status是響應的HTTP狀態,statusText是HTTP狀態的說明

readyState是表示在請求/響應過程中的當前活動處于哪個階段

參考文章

你真的會使用XMLHttpRequest嗎?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83459.html

相關文章

  • XMLHttpRequest快餐

    摘要:一次完整的請求對于很多對象來說,都會有狀態,事件和方法。其中的狀態和事件其實就是對象的屬性。下載的事件屬于對象,上傳的事件屬于對象。事件傳輸被用戶取消。返回所有響應頭信息響應頭名和值如果響應頭還沒接受則返回重寫由服務器返回的。 XMLHttpRequest可解釋為可擴展超文本傳輸請求。它是一個瀏覽器Api,為客戶端提供了在客戶端和服務器之間傳輸數據的功能。使得Javascript可以進...

    2shou 評論0 收藏0
  • 你不知道的 XMLHttpRequest

    摘要:默認參數為空字符串密碼,可選參數,用于授權。默認參數為空字符串備注如果不是有效的方法或地址不能被成功解析,將會拋出異常如果請求方法不區分大小寫為或將會拋出異常重寫由服務器返回的類型。 本文詳細介紹了 XMLHttpRequest 相關知識,涉及內容: AJAX、XMLHTTP、XMLHttpRequest詳解、XMLHttpRequest Level 1、Level 2 詳解 XHR...

    ckllj 評論0 收藏0
  • ajax的原生實現-XMLHttpRequest

    摘要:的交互原理則是請求事件目標從而到達后端事件目標。事件目標對請求事件進行驗證實現業務邏輯,最后可以響應處理結果與前端交互。 ajax 即Asynchronous Javascript And XML(異步 JavaScript 和 XML),是指一種創建交互式網頁應用的網頁開發技術。當初JavaScript的變革就是ajax的出現而改變。在現代web領域對數據的異步加載和局部更新上也在大...

    liaoyg8023 評論0 收藏0
  • AJAX總結(三),XMLHttpRequest對象

    摘要:包括對象的本質,請求和響應。下例為小張發送給大元的便條,存儲為。表的值常量值含義尚未調用已經調用接收到頭信息接收到響應主體響應完成為了監聽事件,請把事件處理函數設置為對象的屬性。響應包狀態碼,響應頭和響應主體。 前言 博主博客:Stillwater的博客知乎專欄:前端汪汪本文為作者原創轉載請注明出處: http://hiztx.top/2017/01/13/a... ??這篇文章介紹...

    DrizzleX 評論0 收藏0

發表評論

0條評論

Java3y

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<