前端 JS 之 AJAX 簡介及使用

概述

AJAX 是一個縮寫,它的全名是 Asynchronous JavaScript and XML,意思就是異步 JavaScript 和 XML,即用JavaScript執行異步網絡請求

AJAX 不是一種新技術,而是一個在 2005 年被 Jesse James Garrett 提出的新術語,用來描述一種使用現有技術集合的‘新’方法,包括:

  • HTML 或 XHTML
  • CSS
  • JavaScript
  • DOM
  • XML
  • XSLT
  • XMLHttpRequest

儘管 X 在 AJAX 中代表 XML, 但由於 JSON 的許多優勢,比如更加輕量以及作爲 Javascript 的一部分,目前 JSON 的使用比 XML 更加普遍。JSON 和 XML 都被用於在 AJAX 模型中打包信息。

AJAX 的優勢

傳統的網頁(不使用 AJAX)如果需要更新內容,必需重載整個網頁面。

AJAX 通過在後臺與服務器進行少量數據交換,可以使網頁實現異步更新。這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。

XMLHttpRequest 對象

XMLHttpRequest(XHR)對象用於與服務器交互。通過 XMLHttpRequest 可以在不刷新頁面的情況下請求特定 URL,獲取數據。這允許網頁在不影響用戶操作的情況下,更新頁面的局部內容。XMLHttpRequest 在 AJAX 編程中被大量使用。

AJAX 的工作原理

其工作原理基本經過以下幾個步驟:

  1. 客戶端發送請求,請求交給 xhr。
  2. xhr 把請求提交給服務。
  3. 服務器進行業務處理。
  4. 服務器響應數據交給 xhr 對象。
  5. xhr 對象接收數據,由 JavaScript 把數據寫到頁面上。

AJAX 工作原理

AJAX 的創建步驟

根據 AJAX 的工作原理,它的創建步驟主要包括:

  1. 創建 XMLHttpRequest 對象,即創建一個異步調用對象。
  2. 創建一個新的 HTTP 請求,並指定該 HTTP 請求的方法、URL 及驗證信息。
  3. 設置響應 HTTP 請求狀態變化的函數。
  4. 發送 HTTP 請求。
  5. 獲取異步調用返回的數據。
  6. 使用 JavaScript 和 DOM 實現局部刷新。

AJAX 的具體使用

以下是 使用 AJAX 的完整流程。

1. 創建 XMLHttpRequest 對象

const request = new XMLHttpRequest();

2. 創建一個新的 HTTP 請求,並指定該 HTTP 請求的方法、URL 及驗證信息

創建 HTTP 請求可以使用 XMLHttpReques t對象的 open() 方法,其語法代碼如下:

request.open(method, url, async, user, password);

參數解析:

  • method 要使用的HTTP方法,比如 "GET"、"POST"、"PUT"、"DELETE" 等。
  • url 表示要向其發送請求的 URL 地址。
  • async (可選) 一個可選的布爾參數,表示是否異步執行操作,默認爲 true。如果值爲 false,send() 方法直到收到答覆前不會返回。如果 true,已完成事務的通知可供事件監聽器使用。如果 multipart 屬性爲 true 則這個必須爲 true,否則將引發異常。
  • user (可選 用於認證用途的用戶名,默認值爲 null。
  • password (可選) 用於認證用途的密碼,默認值爲 null。

3. 設置響應 HTTP 請求狀態變化的函數和服務端返回信息函數

創建完 HTTP 請求之後,應該就可以將 HTTP 請求發送給 Web 服務器了。然而,發送 HTTP 請求的目的是爲了接收從服務器中返回的數據。從創建 XMLHttpRequest 對象開始,到發送數據、接收數據、XMLHttpRequest 對象一共會經歷以下 5 種狀態:

  • 未初始化狀態。在創建完 XMLHttpRequest 對象時,該對象處於未初始化狀態,此時 XMLHttpRequest 對象的 readyState 屬性值爲 0。
  • 初始化狀態。在創建完 XMLHttpRequest 對象後使用 open() 方法創建了 HTTP 請求時,該對象處於初始化狀態。此時 XMLHttpRequest 對象的readyState屬性值爲 1。
  • 發送數據狀態。在初始化 XMLHttpRequest 對象後,使用 send() 方法發送數據時,該對象處於發送數據狀態,此時XMLHttpRequest 對象的 readyState 屬性值爲 2。
  • 接收數據狀態。Web 服務器接收完數據並進行處理完畢之後,向客戶端傳送返回的結果。此時,XMLHttpRequest 對象處於接收數據狀態,XMLHttpRequest 對象的 readyState 屬性值爲 3。
  • 完成狀態。XMLHttpRequest 對象接收數據完畢後,進入完成狀態,此時 XMLHttpRequest 對象的 readyState 屬性值爲 4。此時接收完畢後的數據存入在客戶端計算機的內存中,可以使用 responseText 屬性或 responseXml 屬性來獲取數據。

總的來說,readyState 屬性的值有以下幾種:

  • 0 (未初始化) or (請求還未初始化)
  • 1 (正在加載) or (已建立服務器鏈接)
  • 2 (加載成功) or (請求已接受)
  • 3 (交互) or (正在處理請求)
  • 4 (完成) or (請求已完成並且響應已準備好)

只讀屬性 XMLHttpRequest.status 返回了 XMLHttpRequest 響應中的數字狀態碼。status 的值是一個無符號短整型。在請求完成前,status 的值爲 0。值得注意的是,如果 XMLHttpRequest 出錯,瀏覽器返回的 status 也爲0:

  • UNSENT(未發送) 0
  • OPENED(已打開) 0
  • LOADING(載入中) 200
  • DONE(完成) 200
var xhr = new XMLHttpRequest();
console.log('UNSENT', xhr.readyState); // readyState 爲 0

xhr.open('GET', '/api', true);
console.log('OPENED', xhr.readyState); // readyState 爲 1

xhr.onprogress = function () {
    console.log('LOADING', xhr.readyState); // readyState 爲 3
};

xhr.onload = function () {
    console.log('DONE', xhr.readyState); // readyState 爲 4
};

xhr.send(null);

只有在XMLHttpRequest對象完成了以上5個步驟之後,纔可以獲取從服務器端返回的數據。因此,如果要獲得從服務器端返回的數據,就必須要先判斷XMLHttpRequest對象的狀態:

const xhr = new XMLHttpRequest();
xmlHttpRequest.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        // do something here
    }
}

4. 發送HTTP請求

XMLHttpRequest.send(data);

結束

最後,附上一個簡單的完整 AJAX 實例:

<button id="ajaxButton" type="button">Make a request</button>

<script>
    var httpRequest;
    document.getElementById("ajaxButton").addEventListener('click', makeRequest);

    function makeRequest() {
        httpRequest = new XMLHttpRequest();

        httpRequest.onreadystatechange = alertContents;
        httpRequest.open('GET', 'test.html');
        httpRequest.send();
    }

    function alertContents() {
        if (httpRequest.readyState === XMLHttpRequest.DONE) {
            if (httpRequest.status === 200) {
                alert(httpRequest.responseText);
            } else {
                alert('There was a problem with the request.');
            }
        }
    }
</script>

AJAX-Logo

~

~

~ 本文完

~

學習有趣的知識,結識有趣的朋友,塑造有趣的靈魂!

大家好!我是〖編程三昧〗的作者 隱逸王,我的公衆號是『編程三昧』,歡迎關注,希望大家多多指教!

知識與技能並重,內力和外功兼修,理論和實踐兩手都要抓、兩手都要硬!

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