JavaScript學習筆記(十六) XMLHttpRequest

1、介紹

(1)AJAX(Asynchronous JavaScript and XML)

AJAX 原來是指通過異步 JavaScript 從服務器 XML 文檔獲取數據,然後更新網頁的對應部分,避免刷新整個網頁

後來,這個詞語慢慢成爲在瀏覽器通過腳本與服務器進行通信的代名詞,它在原來的含義上有了更多的拓展

也就是說,只要通過腳本向服務器發送請求獲取數據,這個請求都被稱爲 AJAX 請求

(2)XMLHttpRequest

XMLHttpRequest 是瀏覽器的內置對象,通過這個對象,我們能向服務器發送請求和接收響應,實現數據交換

很多 AJAX 底層都是通過 XMLHttpRequest 對象實現

2、使用

可以通過構造函數 XMLHttpRequest() 創建一個 XMLHttpRequest 對象

XMLHttpRequest 對象常用的屬性如下:

  • readyState:只讀屬性,表示請求的當前狀態

    若爲 0,表示已經生成請求實例,但未調用 open() 方法

    若爲 1,表示已經調用 open() 方法,但未調用 send() 方法

    若爲 2,表示已經調用 send() 方法,且已收到服務器返回的頭信息

    若爲 3,表示正在接收服務器返回的數據體

    若爲 4,表示服務器返回的數據已全部接收完畢,或者發生錯誤

  • response:只讀屬性,表示服務器返回的數據,其類型由 responseType 的值決定

  • responseType:定義返回數據的類型,它的值是一個字符串

    若爲 'text''',表示服務器返回文本數據

    若爲 'json',表示服務器返回 Json 對象

    若爲 'blob',表示服務器返回 Blob 對象

    若爲 'arraybuffer',表示服務器返回 ArrayBuffer 對象

    若爲 'document',表示服務器返回 Document 對象

  • responseText:只讀屬性,表示服務器返回的文本數據,如果請求失敗則爲 null

  • responseXML:只讀屬性,表示服務器返回的 Document 對象,如果請求失敗則爲 null

  • responseURL:只讀屬性,表示返回數據的服務器的網址

  • status:只讀屬性,表示 HTTP 狀態代碼

  • statusText:只讀屬性,表示 HTTP 狀態信息

  • timeout:定義請求的超時時間,若請求超過該時間,則自動結束此請求

  • withCredentials:一個布爾類型的值,表示在跨域請求時是否帶有授權信息

XMLHttpRequest 對象常用的方法如下:

  • open():初始化請求,它接收以下五個參數

    參數 method 是一個字符串,表示將要使用的請求方法

    參數 url 是一個字符串,表示發送請求的目標地址

    參數 async 是一個布爾值,表示請求是否需要異步進行,默認爲 true

    參數 user 是一個字符串,表示用於認證的用戶,默認爲空字符串

    參數 password 是一個字符串,表示用於認證的密碼,默認爲空字符串

  • setRequestHeader():設置請求頭,必須在 open() 之後 send() 之前調用

  • overrideMimeType():將服務器返回的數據解析成指定類型,必須在 open() 之後 send() 之前調用

  • send():發送請求,可以在參數中帶上請求體

    請求體的類型可以是 nullStringBlobArrayBufferDocumentFormData

  • abort():中止請求

  • getAllResponseHeaders():獲取所有響應頭

  • getResponseHeader():獲取指定響應頭

XMLHttpRequest 對象常用的事件如下:

  • readystatechangereadyState 發生變化時觸發

  • loadstart:當請求開始時觸發(發出 HTTP 請求)

  • loadend:當請求結束時觸發(請求成功或者失敗)

  • load:當請求成功時觸發

  • error:當請求錯誤時觸發

  • abort:當請求中止時觸發

  • timeout:當請求超時時觸發

  • progress:監聽上傳和下載進度,該事件對應的事件處理函數帶有一個事件對象,該事件對象有三個屬性

    屬性 loaded 表示已經傳輸的數據量,屬性 total 表示總數據量

    屬性 lengthComputable 表示加載進度是否可以計算,是一個布爾類型的值

這裏需要注意,下載觸發的是 xhr 對象的 progress 事件,上傳觸發的是 xhr.upload 對象的 progress 事件

3、實例

(1)發送 GET 請求

var xhr = new XMLHttpRequest()

xhr.responseType = 'text'

xhr.open('GET', 'http://www.httpbin.org/get')

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            console.log(xhr.responseText)
        } else {
            console.error(xhr.statusText)
        }
    }
}

xhr.onerror = function() {
    console.log('error')
}

xhr.send()

(2)發送 POST 請求

var xhr = new XMLHttpRequest()

xhr.open('POST', 'http://www.httpbin.org/post')

xhr.onload = function() {
    console.log(xhr.response)
}

xhr.onerror = function() {
    console.log('error')
}

var data = new FormData()
data.append('username', 'admin')
data.append('password', '12345')

xhr.send(data)

(3)接收圖片

var xhr = new XMLHttpRequest()

xhr.open('GET', '/path/to/image.png')

xhr.responseType = 'blob'

xhr.onload = function() {
    if (this.status === 200) {
    	var blob = xhr.response
        
        var img = document.createElement('img')
        img.onload = function() { window.URL.revokeObjectURL(img.src) }
        ime.src = window.URL.createObjectURL(blob)
        document.getElementById('container').appendChild(img)
    }
}

xhr.send()

(4)監聽進度

var xhr = new XMLHttpRequest()

xhr.open('GET', '/download/or/upload')

// 用於監聽上傳進度
xhr.onprogress = progressHandler
// 用於監聽上傳進度
xhr.upload.onprogress = progressHandler

function progressHandler(e) {
    if (e.lengthComputable) {
        console.log(e.loaded / e.total)
    } else {
        console.log('無法獲取進度')
    }
}

xhr.send()

【 閱讀更多 JavaScript 系列文章,請看 JavaScript學習筆記

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章