AJAX原理與XMLHttpRequest

目錄

一、XMLHttpRequest使用步驟

基本語法

步驟 1:創建 XHR 對象

步驟 2:調用?open()?方法

步驟 3:監聽?loadend?事件

步驟 4:調用?send()?方法

二、完整示例

1. GET 請求(帶查詢參數)

2. POST 請求(提交 JSON 數據)

三、關鍵注意事項

四、URLSearchParams

1.?URLSearchParams?的作用

2. 代碼示例解析

3.?URLSearchParams?常用方法

1.?添加參數

2.?刪除參數

3.?獲取參數值

4.?遍歷參數

4. 處理特殊字符

5. 可選鏈操作符

?五、簡易封裝axios

1. Axios 核心設計

2. 簡易封裝示例

3. AJAX 與 Axios 對比


AJAX(Asynchronous JavaScript and XML)核心原理:通過瀏覽器提供的 XMLHttpRequest(XHR)對象,實現異步通信,無需刷新頁面即可與服務器交換數據。

一、XMLHttpRequest使用步驟

基本語法

  • 創建對象 → 配置請求 → 監聽事件 → 發送請求?
const xhr = new XMLHttpRequest()
xhr.open('請求方法', '請求url網址')
xhr.addEventListener('loadend', () => {// 響應結果console.log(xhr.response)
})
xhr.send()

步驟 1:創建 XHR 對象

const xhr = new XMLHttpRequest();
  • 作用:初始化一個 XHR 實例,用于后續的請求配置和操作。

  • 注意:舊版 IE(< IE7)需使用?ActiveXObject,但現代瀏覽器無需兼容處理。


步驟 2:調用?open()?方法

xhr.open(method, url, async);
  • 參數說明

    • method:HTTP 方法(GETPOSTPUT?等)。

    • url:請求的目標地址(支持絕對或相對路徑)。

    • async:是否異步(默認為?true,強烈建議使用異步)。

  • 關鍵點

    • GET 請求的查詢參數需直接拼接到 URL 中(需手動編碼)。

      const params = { page: 1, keyword: 'AJAX' };
      const query = new URLSearchParams(params).toString(); // 自動編碼
      const url = `https://api.example.com/data?${query}`;
      xhr.open('GET', url, true);
    • POST 請求的數據在?send()?中傳遞(需配合請求頭)。


步驟 3:監聽?loadend?事件

xhr.addEventListener('loadend', function() {// 請求完成(無論成功或失敗)if (xhr.status >= 200 && xhr.status < 300) {console.log('成功:', xhr.responseText);} else {console.error('失敗:', xhr.status, xhr.statusText);}
});
  • loadend?事件特性

    • 在請求完成(包括成功、失敗或取消)后觸發。

    • 替代傳統?onreadystatechange?的繁瑣狀態判斷。

  • 響應數據獲取

    • xhr.responseText:字符串形式的響應數據(如 JSON、HTML)。

    • xhr.response:根據?responseType?自動轉換后的數據(如 JSON 對象)。


步驟 4:調用?send()?方法

xhr.send(body);
  • GET 請求send()?無參數或傳?null

    xhr.send();
  • POST 請求:傳遞請求體數據(需設置?Content-Type)。

    // 設置請求頭(JSON 格式)
    xhr.setRequestHeader('Content-Type', 'application/json');// 提交 JSON 數據
    const postData = JSON.stringify({ username: 'john', age: 25 });
    xhr.send(postData);// 提交 FormData(文件上傳)
    const formData = new FormData();
    formData.append('file', fileInput.files[0]);
    xhr.send(formData);

二、完整示例

1. GET 請求(帶查詢參數)

const xhr = new XMLHttpRequest();// 構建帶查詢參數的 URL
const params = { page: 1, search: 'AJAX 教程' };
const url = `https://api.example.com/data?${new URLSearchParams(params)}`;xhr.open('GET', url, true);xhr.addEventListener('loadend', () => {if (xhr.status === 200) {const data = JSON.parse(xhr.responseText);console.log('數據:', data);} else {console.error(`請求失敗: ${xhr.status}`);}
});xhr.send();

2. POST 請求(提交 JSON 數據)

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/submit', true);// 設置請求頭
xhr.setRequestHeader('Content-Type', 'application/json');xhr.addEventListener('loadend', () => {if (xhr.status === 201) {console.log('提交成功:', xhr.responseText);} else {console.error(`錯誤: ${xhr.status}`);}
});// 提交 JSON 數據
const data = { title: 'XHR 教程', content: '詳細指南' };
xhr.send(JSON.stringify(data));

三、關鍵注意事項

  1. 查詢參數編碼

    // 手動編碼示例
    const keyword = '前端&后端';
    const encodedKeyword = encodeURIComponent(keyword); // → '前端%26后端'
    • 使用?URLSearchParams?或?encodeURIComponent?避免特殊字符問題。

  2. POST 請求頭設置

    • 必須根據數據類型設置?Content-Type,否則服務器無法正確解析。

      • application/json:JSON 數據。

      • multipart/form-data:文件上傳。

      • application/x-www-form-urlencoded:表單數據。

  3. 錯誤處理

    • 結合?loadend?和?xhr.status?處理 HTTP 狀態碼。

    • 監聽?error?和?timeout?事件處理網絡錯誤和超時。

      xhr.addEventListener('error', () => {console.error('網絡錯誤');
      });xhr.timeout = 5000; // 設置超時時間
      xhr.addEventListener('timeout', () => {console.error('請求超時');
      });
  4. 同步請求已廢棄

    • open()?的第三個參數若設為?false(同步請求),會導致頁面阻塞,現代開發中禁止使用。

XHR和Axios的默認請求頭對比

場景XHR(原生)Axios
發送 JSON 數據需手動設置?Content-Type自動設置?Content-Type: application/json
發送 FormData自動設置?multipart/form-data自動設置?multipart/form-data
全局默認頭支持通過?axios.defaults.headers?配置全局頭
攔截器支持請求/響應攔截器統一管理頭

必須聲明Headers的情況

場景XHRAxios
發送非表單數據必須手動設置?Content-Type自動處理,可手動覆蓋
身份認證必須設置?Authorization必須設置?Authorization
跨域自定義頭必須聲明且服務器允許必須聲明且服務器允許
文件上傳使用?FormData?時自動處理使用?FormData?時自動處理

四、URLSearchParams

1.?URLSearchParams?的作用

URLSearchParams?是一個 Web API,用于解析、操作 URL 的查詢參數(即???后的部分)。它可以:

  1. 將對象轉換為 URL 查詢字符串(自動編碼特殊字符)。

  2. 解析現有查詢字符串為鍵值對。

  3. 動態添加、刪除、遍歷參數


2. 代碼示例解析

qObj = { key1: 'value1', key2: 'value2' }
const paramsObj = new URLSearchParams(qObj);
const queryString = paramsObj.toString();
xhr.open('GET', `http://example.net/api?${queryString}`);

步驟分解:

  1. 創建?URLSearchParams?實例

    const paramsObj = new URLSearchParams(qObj);
    • 假設?qObj?是一個對象(如?{ key1: 'value1', key2: 'value2' })。

    • URLSearchParams?會將其轉換為鍵值對結構。

  2. 生成查詢字符串

    const queryString = paramsObj.toString();
    • toString()?方法將參數轉換為標準的 URL 查詢字符串(如?key1=value1&key2=value2)。

    • 自動處理編碼:空格轉為?%20,中文轉為?%E4%B8%AD?等。

  3. 拼接完整 URL

    xhr.open('GET', `http://example.net/api?${queryString}`);
    • 最終生成的 URL 示例:
      http://example.net/api?key1=value1&key2=value2


3.?URLSearchParams?常用方法

1.?添加參數
paramsObj.append('page', 1); // 添加新參數
paramsObj.append('page', 2); // 允許重復鍵:page=1&page=2
2.?刪除參數
paramsObj.delete('key1'); // 刪除指定鍵
3.?獲取參數值
const value = paramsObj.get('key1'); // 獲取第一個值
const allValues = paramsObj.getAll('page'); // 獲取所有值(數組)
4.?遍歷參數
for (const [key, value] of paramsObj) {console.log(key, value);
}

4. 處理特殊字符

URLSearchParams?會自動編碼特殊字符,無需手動調用?encodeURIComponent
示例:

const params = new URLSearchParams({ city: '北京', q: 'a&b=c' });
console.log(params.toString()); 
// 輸出:city=%E5%8C%97%E4%BA%AC&q=a%26b%3Dc

5. 可選鏈操作符

JavaScript 中的??.?是可選鏈操作符(Optional Chaining Operator),用于安全地訪問對象的深層屬性。它的作用是:當某個中間屬性為?null?或?undefined?時,直接返回?undefined,而不會拋出錯誤。


代碼示例分析:

// 假設 xhr 是 XMLHttpRequest 的實例
const data = xhr.response?.data;
  1. xhr.response
    XHR 請求完成后,xhr.response?是服務器返回的數據。
    如果請求未完成或失敗,xhr.response?可能是?null?或?undefined

  2. xhr.response?.data

    • 如果?xhr.response?存在:繼續訪問?data?屬性。

    • 如果?xhr.response?是?null?或?undefined:直接返回?undefined,不會嘗試訪問?.data

可選鏈操作符(?.)的核心規則:

場景代碼示例結果
屬性存在obj?.prop返回?obj.prop
屬性不存在(null/undefinedobj?.prop返回?undefined不會報錯
深層屬性訪問obj?.prop1?.prop2逐層檢查,任一中間屬性為?null/undefined?則返回?undefined
函數調用obj.method?.()如果?obj.method?存在則調用,否則返回?undefined

?五、簡易封裝axios

Axios 原理:基于?Promise?封裝的 HTTP 客戶端庫,底層依賴?XMLHttpRequest(瀏覽器)或?http?模塊(Node.js),提供更簡潔、強大的 API。

1. Axios 核心設計

  1. 適配器模式

    • 瀏覽器環境:使用?XMLHttpRequest?發送請求。

    • Node.js 環境:使用?http?模塊發送請求。

    • 統一 API:開發者無需關注底層差異。

  2. 攔截器機制

    • 請求攔截器:在請求發送前統一處理(如添加 Token)。

    • 響應攔截器:在響應返回后統一處理(如錯誤過濾)。

    // 添加請求攔截器
    axios.interceptors.request.use(config => {config.headers.Authorization = 'Bearer token';return config;
    });// 添加響應攔截器
    axios.interceptors.response.use(response => response.data, // 提取 data 字段error => Promise.reject(error)
    );
  3. 配置合并策略

    • 全局配置 → 實例配置 → 單次請求配置,優先級遞增。

    • 自動處理?headers(如?Content-Type?根據數據類型推斷)。

  4. Promise 鏈式調用

    • 所有請求返回?Promise?對象,支持?async/await

    • 錯誤通過?.catch()?或?try/catch?統一處理。

2. 簡易封裝示例

模擬 axios 函數封裝,更深入了解 axios 內部運作原理:

//定義myAxios函數,接收配置對象,返回Promise對象
function myAxios(config) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest()//判斷有params選項,攜帶查詢參數if (config.params) {//使用URLSearchParams轉換,并攜帶到url上const paramsObj = new URLSearchParams(config.params)const queryString = paramsObj.toString()config.url += `?${queryString}`}//發起XHR請求,默認請求方法為GETxhr.open(config.method || 'GET', config.url)xhr.addEventListener('loadend', () => {//調用成功/失敗的處理程序if (xhr.status >= 200 && xhr.status < 300) {resolve(JSON.parse(xhr.response))}else {reject(new Error(xhr.response))}})//判斷有data選項,攜帶請求體if (config.data) {xhr.setRequestHeader('Content-Type', 'application/json')xhr.send(JSON.stringify(config.data))}else {xhr.send()}})
}

3. AJAX 與 Axios 對比

特性AJAX(原生 XHR)Axios
底層實現直接操作?XMLHttpRequest?對象封裝 XHR 或 Node.js?http?模塊,提供統一 API
異步處理回調函數基于?Promise,支持?async/await
數據轉換手動解析 JSON、XML 等格式自動轉換 JSON 數據
攔截器需手動實現內置請求/響應攔截器
取消請求使用?xhr.abort()支持?CancelToken?和?AbortController
跨域處理需服務端配合 CORS 或 JSONP自動處理 CORS,支持?withCredentials?配置
代碼簡潔性冗余,需手動處理細節鏈式調用,配置化 API

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76767.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python寫個0~12個月寶寶喂養規劃表

下載字體&#xff1a;https://github.com/adobe-fonts/source-han-sans/releases 下載fpdf2 pip uninstall fpdf pip install fpdf2運行代碼 ?from fpdf import FPDF from fpdf.enums import XPos, YPos# 創建 PDF 類 class BabyFeedingPDF(FPDF):def header(self):self.s…

集中趨勢描述

一、集中趨勢的定義與核心目標 集中趨勢指數據向其中心值聚集的傾向,反映數據的典型水平或分布中心。其核心是通過統計指標(如眾數、中位數、均值)概括數據的核心特征,幫助快速理解數據分布的核心位置。 核心作用:簡化復雜數據、指導業務決策(如確定用戶平均消費水平)、…

【NLP】Attention機制

1.模型對比 RNN(馬爾科夫鏈式編碼) 通過遞歸計算逐個處理 token,當前編碼結果 h t h_t ht?僅依賴前一步的隱藏狀態 h t ? 1 h_{t-1} ht?1?和當前輸入 x t x_t xt?局限性:序列建模需嚴格串行,無法并行;長距離依賴易丟失(梯度消失/爆炸)例:雙向 LSTM 需正向+反向兩…

基于OpenCV與PyTorch的智能相冊分類器全棧實現教程

引言&#xff1a;為什么需要智能相冊分類器&#xff1f; 在數字影像爆炸的時代&#xff0c;每個人的相冊都存儲著數千張未整理的照片。手動分類不僅耗時&#xff0c;還容易遺漏重要瞬間。本文將手把手教你構建一個基于深度學習的智能相冊分類系統&#xff0c;實現&#xff1a;…

活動安排問題 之 前綴和與差分

文章目錄 D. Robert Hood and Mrs Hood 考慮到一個活動開始時間和結束時間s,e&#xff0c;那么可以影響到的范圍就是 s-d1,e,所以我們只需對這個每一個活動可以影響到的區域進行標記即可&#xff0c;當然為了降低時間復雜度&#xff0c;我們將使用前綴和與差分 t int(input()…

C++之 多繼承

在學校里有老師和學生&#xff0c;他們都是人&#xff0c;我么應該創建一個名為 Person 的基類和兩個名為 Teacher 和Student 的子類&#xff0c;后兩者是從前者繼承來的 有一部分學生還教課掙錢&#xff08;助教&#xff09;&#xff0c;也就是同時存在著兩個”是一個”關系&…

大數據學習棧記——Redis安裝及其使用

本文介紹NoSQL技術&#xff1a;Redis的安裝及其使用。操作系統&#xff1a;Ubuntu24.04 Redis介紹 Redis是一個鍵值&#xff08;key-value&#xff09;存儲系統&#xff0c;即鍵值對非關系型數據庫&#xff0c;和Memcached類似&#xff0c;目前正在被越來越多的互聯網公司采用…

2024團體程序設計天梯賽L3-1 奪寶大賽

L3-037 奪寶大賽 分數 30 作者 陳越 單位 浙江大學 奪寶大賽的地圖是一個由 nm 個方格子組成的長方形&#xff0c;主辦方在地圖上標明了所有障礙、以及大本營寶藏的位置。參賽的隊伍一開始被隨機投放在地圖的各個方格里&#xff0c;同時開始向大本營進發。所有參賽隊從一個方格…

JMeter的高并發和高頻率和分布式

性能測試 模擬各種正常的、峰值的測試環境&#xff0c;檢測程序的各項性能指標是否能夠達標 高并發 JMeter中內置了定時器&#xff0c;可以實現時間模式相關的性能測試 需求1:同一時刻100個同學去訪問學生管理系統的查詢所有學院信息功能&#xff0c;統計高并發情況下平均響…

ubuntu學習day2

linux常用命令 3.文件查看及處理命令 3.1查看文件內容 cat[選項][文件] -b 對非空輸出行編號 -E 在每行結束處顯示$ -n 對輸出的所有行編號 -s 不輸出多行空行 標準輸入、標準輸出和標準錯誤 在 Linux 中&#xff0c;每個進程默認有三個文件描述符&#xff1a; 標準輸入&…

項目中引入 Redis 及 常用五種數據類型

在平常的開發過程中&#xff0c;我們經常會用到緩存的技術。比如&#xff0c;驗證碼60秒后過期、計數器的實現、商品信息存儲在緩存中快速展示等。那么&#xff0c;項目中經常會使用到的便是 redis 緩存。redis 在內存中操作&#xff0c;讀寫快。Redis 常用的數據類型有五種&am…

Spark-SQL簡介及核心編程

Spark-SQL概述&#xff1a;是Spark用于結構化數據處理的模塊&#xff0c;前身是Shark。Shark基于Hive開發&#xff0c;使SQL-on-Hadoop性能大幅提升&#xff0c;但對Hive依賴制約了Spark發展。SparkSQL汲取Shark優點并重新開發&#xff0c;在數據兼容、性能優化和組件擴展上優勢…

奇趣點播系統測試報告

1.項目簡介 本項目旨在搭建一個視頻共享點播系統&#xff0c;服務器支持用戶通過前端瀏覽器訪問服務器&#xff0c;獲取展示與觀看和操作的界面&#xff0c;最終實現視頻的上傳以及觀看和刪改查等基礎管理功能。讓用戶擁有良好的觀看體驗和分享視頻的快捷方式&#xff0c;此外…

【Web API系列】WebSocketStream API 深度實踐:構建高吞吐量實時應用的流式通信方案

前言 在當今的 Web 開發領域&#xff0c;實時通信已成為許多應用的核心需求。無論是即時聊天、實時數據儀表盤&#xff0c;還是在線游戲和金融交易系統&#xff0c;都需要高效的雙向數據傳輸能力。傳統的 WebSocket API 為此提供了基礎支持&#xff0c;但在處理大規模數據流、…

基于LangGraph的智能報告生成平臺項目分析

前言 不知道你是否知道或者了解OpenAI and Gemini Deep Research。他們是一種能夠根據輸入問題進行規劃、結合網絡搜索獲取信息并最終呈現結果的研究工具或技術。那這樣research是如何實現的呢?最近剛好看到一個實現類似功能的開源項目: open_deep_search。本文將基于該項目進…

Redis 常見的集群架構

Redis 常見的集群架構 以下是 Redis 常見的集群架構及其核心模式詳解&#xff0c;結合其設計原理、適用場景和優缺點進行綜合說明&#xff1a; 一、主從復制模式 架構原理 角色劃分&#xff1a;包含一個主節點&#xff08;Master&#xff09;和多個從節點&#xff08;Slave&…

面試寶典(C++基礎)-01

文章目錄 1. C++基礎1.1 C++特點1.2 說說C語言和C++的區別1.3 說說 C++中 struct 和 class 的區別1.4 include頭文件的順序以及雙引號""和尖括號<>的區別1.5 說說C++結構體和C結構體的區別1.6 導入C函數的關鍵字是什么,C++編譯時和C有什么不同?1.7 C++從代碼…

快速獲得ecovadis認證的方法,如何提升ecovadis認證分數,有效期是多久

快速獲得EcoVadis認證的方法 EcoVadis認證是企業社會責任&#xff08;CSR&#xff09;和可持續發展能力的國際評估標準&#xff0c;被廣泛應用于供應鏈管理&#xff08;如蘋果、微軟、聯合利華等巨頭要求供應商通過EcoVadis評估&#xff09;。以下是快速獲得認證的關鍵步驟&am…

ubuntu 安裝samba

ubuntu 版本&#xff1a;Ubuntu 24.04.2 LTS 1. 保證連網 2. 安裝samba sudo apt install samba 在安裝結束以后&#xff0c;我們可以使用下面的命令來查看安裝&#xff1a; apt list | grep samba freeipa-client-samba/noble 4.11.1-2 amd64 ldb-tools/noble 2:2.8.0samba…

基于SpringBoot的寵物健康咨詢系統(源碼+數據庫+萬字文檔)

502基于SpringBoot的寵物健康咨詢系統&#xff0c;系統包含三種角色&#xff1a;管理員、用戶&#xff0c;顧問主要功能如下。 【用戶功能】 1. 首頁&#xff1a;查看系統主要信息和最新動態。 2. 公告&#xff1a;瀏覽系統發布的公告信息。 3. 顧問&#xff1a;瀏覽可提供咨詢…