Ajax 核心知識點全面總結

文章目錄

  • Ajax 核心知識點全面總結
    • 一、Ajax 基礎概念
      • 1、定義
      • 2、核心特點
    • 二、Ajax 工作原理與核心組件
      • 1、工作流程
      • 2、XMLHttpRequest(XHR)對象
    • 三、Ajax 請求方法與參數
      • 1、常見請求方法
      • 2、請求參數處理
    • 四、Ajax 異步與錯誤處理
      • 1、異步處理
      • 2、錯誤處理
    • 五、跨域資源共享(CORS)與解決方案
      • 1、跨域問題
      • 2、解決方案
    • 六、Ajax 與現代替代方案
      • 1、Fetch API(ES6+)
      • 2、Axios(第三方庫)
    • 七、Ajax 最佳實踐與性能優化
    • 八、Ajax 安全性考慮
    • 九、經典 Ajax 示例(原生 JavaScript)
    • 十、Ajax 封裝全局 API

Ajax 核心知識點全面總結

一、Ajax 基礎概念

1、定義

Ajax(Asynchronous JavaScript and XML)是一種 無需重新加載整個網頁,即可通過 JavaScript 與服務器異步交換數據的技術,用于創建更流暢、響應更快的 Web 應用。

2、核心特點

  1. 異步通信:客戶端與服務器通信時不阻塞頁面渲染,用戶可繼續交互。
  2. 數據驅動更新:僅更新頁面部分內容,減少帶寬消耗。
  3. 多技術融合:結合 JavaScript、XML(或 JSON)、HTML/CSS 等技術。

二、Ajax 工作原理與核心組件

1、工作流程

  1. 客戶端通過 JavaScript 發起請求;
  2. 瀏覽器創建 XMLHttpRequest(XHR) 對象與服務器通信;
  3. 服務器處理請求并返回數據(XML、JSON 等);
  4. JavaScript 接收數據并更新頁面 DOM。

2、XMLHttpRequest(XHR)對象

創建方式const xhr = new XMLHttpRequest();
關鍵方法

  • open(method, url, async):設置請求方法、URL 和異步模式(默認 true)。
  • send(data):發送請求,data 為請求體(GET 請求時可為 null)。
  • abort():取消請求。

關鍵屬性

  • readyState:請求狀態(0 - 未初始化,1 - 已調用 open,2 - 已接收響應頭,3 - 處理中,4 - 請求完成)。
  • status:HTTP 狀態碼(如 200 成功,404 未找到)。
  • responseText/responseXML:返回的文本 / XML 數據。

事件監聽:

  • onreadystatechange:狀態變化時觸發,常用于檢查 readyState === 4 且 status === 200

三、Ajax 請求方法與參數

1、常見請求方法

方法用途特點
GET獲取資源參數附在 URL 后(如 ?key=value),有長度限制,瀏覽器會緩存。
POST提交數據參數在請求體中,無長度限制,不會緩存。
DELETE刪除資源刪除指定資源,需服務器支持。
PUT更新資源覆蓋式更新,需服務器支持。

2、請求參數處理

  • GET 請求url + '?param1=value1&param2=value2'
  • POST 請求:需設置請求頭 Content-Type,如:
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('param1=value1&param2=value2');

或發送 JSON 數據:

xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({ param1: 'value1', param2: 'value2' }));

四、Ajax 異步與錯誤處理

1、異步處理

  • 傳統回調:通過 onreadystatechange 監聽請求完成。
  • Promise 封裝(現代方式):
function fetchData(url) {return new Promise((resolve, reject) => {const xhr = new XMLHttpRequest();xhr.open('GET', url);xhr.onload = () => resolve(xhr.response);xhr.onerror = () => reject(new Error('請求失敗'));xhr.send();});
}

2、錯誤處理

  • onerror 事件:處理網絡錯誤(如服務器不可達)。
  • 狀態碼判斷:
if (xhr.status >= 200 && xhr.status < 300) {// 成功處理
} else {// 錯誤處理,如 404、500 等
}

五、跨域資源共享(CORS)與解決方案

1、跨域問題

  • 同源策略限制:瀏覽器禁止不同域名(協議、域名、端口任一不同)的請求交互。
  • 常見錯誤:Access-Control-Allow-Origin 缺失。

2、解決方案

  • 服務器配置 CORS:在響應頭中添加:
Access-Control-Allow-Origin: * (允許所有域名,生產環境建議指定域名)
Access-Control-Allow-Methods: GET, POST, PUT
  • 代理服務器:前端請求本地代理,由代理轉發至目標服務器(如 Node.js 中間件)。
  • JSONP:利用 script 標簽跨域特性(僅支持 GET 請求):
function loadScript(url, callback) {const script = document.createElement('script');script.src = url + `?callback=${callback.name}`;window[callback.name] = callback;document.body.appendChild(script);
}

六、Ajax 與現代替代方案

1、Fetch API(ES6+)

  • 優點:更簡潔的 Promise 接口,支持流式響應。
  • 示例:
fetch('https://api.example.com/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));

2、Axios(第三方庫)

  • 優點:支持 Promise、請求 / 響應攔截、自動轉換 JSON、瀏覽器與 Node 通用。
axios.get('https://api.example.com/data').then(response => console.log(response.data)).catch(error => console.error(error));

七、Ajax 最佳實踐與性能優化

請求優化:

  • 合并多個小請求為大請求,減少 HTTP 連接開銷。
  • 使用 GET 請求緩存數據(設置 Cache-Control 頭)。

防抖與節流:避免頻繁請求(如搜索聯想功能)。

超時處理:設置 xhr.timeoutontimeout 事件。
請求取消:使用 AbortController(Fetch API)xhr.abort()

八、Ajax 安全性考慮

  • XSS(跨站腳本攻擊):對用戶輸入數據進行轉義,避免直接插入 DOM。
  • CSRF(跨站請求偽造):使用 token 驗證請求來源,或設置 SameSite cookie。
  • 敏感數據傳輸:使用 HTTPS 加密通信。

九、經典 Ajax 示例(原生 JavaScript)

// 發送 GET 請求
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/users', true);
xhr.onreadystatechange = function() {if (xhr.readyState === 4 && xhr.status === 200) {const users = JSON.parse(xhr.responseText);document.getElementById('users-list').innerHTML = users.map(user => `<li>${user.name}</li>`).join('');}
};
xhr.send();// 發送 POST 請求
const xhrPost = new XMLHttpRequest();
xhrPost.open('POST', 'https://api.example.com/login', true);
xhrPost.setRequestHeader('Content-Type', 'application/json');
xhrPost.onload = function() {if (xhrPost.status === 200) {alert('登錄成功');}
};
xhrPost.send(JSON.stringify({ username: 'user', password: 'pass' }));

十、Ajax 封裝全局 API

/*** 通用 AJAX 請求工具* 封裝了 GET、POST、PUT、DELETE 等常用 HTTP 請求方法*/
const HttpUtils = {/*** 發送 GET 請求* @param {string} url - 請求URL* @param {Object} params - 請求參數* @param {Object} options - 額外配置選項* @returns {Promise<Object>} - 返回Promise對象*/get(url, params = {}, options = {}) {return this.request('GET', url, params, null, options);},/*** 發送 POST 請求* @param {string} url - 請求URL* @param {Object} data - 請求數據* @param {Object} options - 額外配置選項* @returns {Promise<Object>} - 返回Promise對象*/post(url, data = {}, options = {}) {return this.request('POST', url, {}, data, options);},/*** 發送 PUT 請求* @param {string} url - 請求URL* @param {Object} data - 請求數據* @param {Object} options - 額外配置選項* @returns {Promise<Object>} - 返回Promise對象*/put(url, data = {}, options = {}) {return this.request('PUT', url, {}, data, options);},/*** 發送 DELETE 請求* @param {string} url - 請求URL* @param {Object} params - 請求參數* @param {Object} options - 額外配置選項* @returns {Promise<Object>} - 返回Promise對象*/delete(url, params = {}, options = {}) {return this.request('DELETE', url, params, null, options);},/*** 發送 HTTP 請求* @param {string} method - HTTP方法* @param {string} url - 請求URL* @param {Object} params - 請求參數* @param {Object} data - 請求數據* @param {Object} options - 額外配置選項* @returns {Promise<Object>} - 返回Promise對象*/request(method, url, params, data, options) {// 處理URL參數if (params && Object.keys(params).length > 0) {const queryString = Object.entries(params).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`).join('&');url += (url.includes('?') ? '&' : '?') + queryString;}// 創建基礎配置const config = {method,headers: {'Content-Type': 'application/json',...options.headers},credentials: options.credentials || 'same-origin',...options};// 添加請求體if (data && (method === 'POST' || method === 'PUT')) {config.body = JSON.stringify(data);}// 返回Promise對象return new Promise((resolve, reject) => {fetch(url, config).then(response => {// 檢查HTTP狀態碼if (!response.ok) {throw new Error(`HTTP error! Status: ${response.status}`);}// 根據Content-Type解析響應const contentType = response.headers.get('Content-Type');if (contentType && contentType.includes('application/json')) {return response.json();} else if (contentType && contentType.includes('text/')) {return response.text();} else {return response.blob();}}).then(result => resolve(result)).catch(error => {console.error('Request failed:', error);reject(error);});});}
};export default HttpUtils;    

以上代碼封裝了常用的 AJAX 請求方法,支持 GET、POST、PUT、DELETE 四種 HTTP 方法。該工具使用原生的 Fetch API 實現,返回 Promise 對象以便于使用 async/await 語法。主要特點:

  • 支持請求參數自動序列化
  • 自動處理響應內容類型解析(JSON、文本、二進制)
  • 統一的錯誤處理機制
  • 支持自定義請求頭和其他配置選項

在你的項目中,可以將此文件保存為 http-utils.js,然后通過 import 語句在需要的地方引入使用,例如:

import HttpUtils from './http-utils.js';// 使用示例
async function fetchData() {try {// GET 請求示例const result = await HttpUtils.get('/api/users', { page: 1, size: 10 });console.log('GET 請求結果:', result);// POST 請求示例const newUser = { name: 'John', age: 30 };const createResult = await HttpUtils.post('/api/users', newUser);console.log('POST 請求結果:', createResult);} catch (error) {console.error('請求出錯:', error);}
}

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

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

相關文章

SpinFlowSim:用于癌癥組織學信息驅動的擴散MRI微血管映射的血流模擬框架|文獻速遞-深度學習醫療AI最新文獻

Title 題目 SpinFlowSim: A blood flow simulation framework for histology-informeddiffusion MRI microvasculature mapping in cancer SpinFlowSim&#xff1a;用于癌癥組織學信息驅動的擴散MRI微血管映射的血流模擬框架 01 文獻速遞介紹 在擴散磁共振成像&#xff08…

量化面試綠皮書:21. 拋硬幣游戲

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 21. 拋硬幣游戲 兩個賭徒正在玩一個拋硬幣游戲。 賭徒A有(n1)枚均勻硬幣&#xff0c;賭徒B有n枚均勻硬幣。 Q: 如果兩人同時拋擲所有硬幣&a…

OpenLayers 框架體系

注&#xff1a;當前使用的是 ol 9.2.4 版本&#xff0c;天地圖使用的key請到天地圖官網申請&#xff0c;并替換為自己的key OpenLayers框架組織結構龐大&#xff0c;只通過官網API進行查看&#xff0c;對框架結構缺少一個整體、全面的看法。借助樹形結構圖或思維導圖&#xff0…

緩存系統-基本概述

目錄 一、系統概述 二、名詞解釋 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、讀寫模式 1、Cache Aside&#xff08;旁路緩存&#xff09; 2、Write Through&#xff08;直寫&#xff09; 3、Write Back&#xff08;回寫&#xff09; 五、問題方案 …

基于GNU Radio Companion搭建的BPSK收發通信實驗

目錄 一、實驗目的和要求 二、實驗內容 1.Lab5 仿真設計一個BPSK的數字收發射系統 Lab6 實際使用RTLSDR解調BPSK信號 一、實驗目的和要求 1.了解軟FM的工作方式和原理,數字通信的碼間串擾及星座圖 2.掌握并正確使用RTL-SDL硬件和Gnuradio軟件 3.正確使用Gnraduo軟件,建…

華為OD機試-返回矩陣中非1的元素、個數/數值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩陣中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…

Redis學習筆記——黑馬點評 消息隊列25-30

前言&#xff1a; 學習收獲&#xff1a; Redis消息隊列&#xff1a; 消息隊列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的隊列。最簡單的消息隊列包括3個角色&#xff1a; 消息隊列&#xff1a;存儲和管理消息&#xff0c;也被稱為消息代理生…

基于Django+Vue3的草莓病害檢測系統設計與實現,Web前后端分離,YOLOv8 Web目標檢測系統

這里寫自定義目錄標題 基于DjangoVue3的草莓病害檢測系統 基于DjangoVue3的草莓病害檢測系統 本項目結合 YOLOv8 與 Django Vue3 &#xff0c;構建了一個通用的 Web 前后端系統&#xff0c;便于用戶進行目標檢測的操作和展示&#xff0c;實現對圖片、視頻實時目標檢測和攝像頭…

【MFC】樹控件的使用詳解

目錄 添加線條鏈接 添加折疊小按鈕 設置樹控件的節點和對應的圖標 設置默認選中項 設置選中項切換響應函數 涉及接口介紹&#xff1a; 首先我們通過資源視圖可以添加一個樹形控件&#xff0c;如下&#xff1a; 添加線條鏈接 在樹形控件中&#xff0c;有一個屬性“Has…

跨境賣家警報。抽繩背包版權案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.對其熱銷的抽繩設計多功能運動背包發起跨境版權維權&#xff0c;保護范圍涵蓋產品外觀設計。 案件基本情況&#xff1a; 起訴時間&#xff1a;2025-6-12 案件號&#xff1a;25-cv-06509 原…

Android Activity全面解析:從創建到生命周期的完整指南

Activity作為Android四大組件之一&#xff0c;是構建用戶界面的核心單元。筆者通過郭霖著的第一行代碼入門安卓&#xff0c;內容基本都取自書中&#xff0c;這篇博客作為筆者的筆記同時精簡了一些書中內容分享在csdn中 一、Activity的創建與基礎配置 1.1 創建Activity的基本步…

深入理解 Python 的 secrets 模塊:打造更安全的隨機數生成機制

深入理解 Python 的 secrets 模塊&#xff1a;打造更安全的隨機數生成機制 在構建涉及用戶身份認證、權限管理、加密通信等系統時&#xff0c;開發者最不能忽視的一個問題就是“安全性”。安全問題的核心之一在于“隨機性”——尤其是密碼、驗證碼、Token、Session、API Key 的…

CHAPTER 19 Concurrency Models in Python

一、A Bit of Jargon 1、關鍵術語解析 1.1 并發 (Concurrency) 定義: 并發是指同時處理多個待處理任務的能力&#xff0c;這些任務可以依次或并行&#xff08;如果可能&#xff09;進行&#xff0c;最終每個任務都會成功或失敗。 理解: 單核 CPU: 即使是單核 CPU 也可以實…

DCM4CHEE Archive Light 開發環境部署(5)-IDEA集成調試配置

系列文章目錄 DCM4CHEE Archive light 開發環境部署(1)-前言DCM4CHEE Archive light 開發環境部署(2)-PostgreSQLDCM4CHEE Archive light 開發環境部署(3)-OpenLDAPDCM4CHEE Archive light 開發環境部署(4)-Wildfly(JBoss)DCM4CHEE Archive light 開發環境部署(5)-IDEA集成…

在rust中執行命令行輸出中文亂碼解決辦法

如果你使用標準的依賴庫執行命令中包含中文的話&#xff0c; 就會發現中文亂碼&#xff0c;如果你的輸出中沒有中文&#xff0c;就可以正常輸出&#xff0c;因為windows的命令行默認使用的是gbk編碼。。。。。 #[tauri::command] pub async fn run_command(command: String) -…

判斷當前瀏覽器卡不卡

方法一&#xff1a;使用 requestAnimationFrame 和時間戳計算平均 FPS let frameCount 0; let lastTime performance.now(); let fps 0; let isSlow false; // 是否卡頓的標志function calculateFPS(currentTime) {frameCount;// 每隔大約 1000 毫秒&#xff08;1秒&#…

51c嵌入式~電路~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11748634 一、延長電子元器件的貨架壽命 本文探討了電子元器件的貨架壽命問題&#xff0c;重點討論了氧化、濕度敏感等級&#xff08;MSL&#xff09;與貨架壽命之間的關系。文章通過具體例子說明了氧化對電子元器件可…

Eureka 與 Feign(一)

Eureka 與 Feign 知識解析 1. Eureka Spring Cloud Eureka 是服務發現組件&#xff0c;包含&#xff1a; Eureka Server&#xff1a;注冊中心&#xff0c;管理服務實例Eureka Client&#xff1a;服務實例&#xff0c;向注冊中心注冊/獲取服務信息 核心功能&#xff1a; 服…

AN動畫軟件|Animate 2025百度云下載與安裝教程指南

如大家所了解的&#xff0c;?Animate全稱Adobe Animate&#xff0c;常常也被簡稱為AN。它是一款2D動畫制作軟件?&#xff0c;其前身為Flash Professional CC&#xff0c;2016年更名為Animate CC&#xff0c;支持Flash SWF文件及HTML5動畫創作&#xff0c;廣泛應用于網頁交互、…

提示詞工程中常見協議框架應用實例

一、生成式診斷催化協議(Generative Diagnosis Catalysis, GDC) 技術原理:基于神經符號系統的因果推理引擎,融合貝葉斯網絡與強化學習 實施場景: class DiagnosticCatalyst:def __init__(self, domain="醫療診斷"):self.causal_graph