Ajax之核心語法詳解

Ajax之核心語法詳解

    • 一、Ajax的核心原理與優勢
      • 1.1 什么是Ajax?
      • 1.2 Ajax的優勢
    • 二、XMLHttpRequest:Ajax的核心對象
      • 2.1 XHR的基本使用流程
      • 2.2 核心屬性與事件解析
        • 2.2.1 `readyState`:請求狀態
        • 2.2.2 `status`:HTTP狀態碼
        • 2.2.3 響應數據屬性
        • 2.2.4 常用事件
    • 三、HTTP請求方法與數據傳遞
      • 3.1 GET請求:獲取數據
      • 3.2 POST請求:提交數據
      • 3.3 其他請求方法
    • 四、Ajax的高級特性
      • 4.1 同步與異步請求
      • 4.2 請求超時設置
      • 4.3 取消請求
    • 五、跨域問題與解決方案
      • 5.1 同源策略的限制
      • 5.2 跨域解決方案
        • 5.2.1 CORS(Cross-Origin Resource Sharing,推薦)
        • 5.2.2 JSONP(僅支持GET請求,兼容性好)
    • 六、常見問題與避坑指南
      • 6.1 跨域錯誤(No 'Access-Control-Allow-Origin' header)
      • 6.2 響應數據解析錯誤(JSON.parse失敗)
      • 6.3 POST請求被瀏覽器轉為OPTIONS請求

Ajax(Asynchronous JavaScript and XML)是前端與后端進行數據交互的核心技術,它允許網頁在不刷新的情況下與服務器交換數據,從而實現動態更新頁面內容。

一、Ajax的核心原理與優勢

1.1 什么是Ajax?

Ajax并非單一技術,而是一組技術的集合,包括JavaScript、XML(或JSON)、HTML/CSS、DOM等,核心是通過XMLHttpRequest對象與服務器進行異步通信。

核心特點

  • 異步通信:請求發送后無需等待服務器響應,可繼續執行其他操作;
  • 局部刷新:服務器返回數據后,僅更新頁面需要變化的部分,無需全頁刷新;
  • 數據交互:與服務器交換的數據格式通常為JSON(替代早期的XML,更輕量)。

1.2 Ajax的優勢

  • 提升用戶體驗:避免全頁刷新,減少等待時間(如表單提交無刷新提示);
  • 減少數據傳輸:僅交換必要數據,而非整個頁面HTML;
  • 增強交互性:實時獲取數據(如搜索框聯想提示、實時聊天)。

二、XMLHttpRequest:Ajax的核心對象

XMLHttpRequest(簡稱XHR)是瀏覽器提供的內置對象,用于與服務器建立連接、發送請求、接收響應,是實現Ajax的基礎。

2.1 XHR的基本使用流程

使用XHR發送請求的完整流程分為5步:

  1. 創建XHR對象;
  2. 配置請求(方法、URL、異步標識);
  3. 注冊響應處理函數;
  4. 發送請求(可選帶數據);
  5. 處理服務器響應。

基礎示例:發送GET請求獲取數據

// 1. 創建XHR對象
const xhr = new XMLHttpRequest();// 2. 配置請求:open(請求方法, URL, 是否異步)
xhr.open('GET', 'https://api.example.com/data', true);// 3. 注冊響應處理函數(監聽readystatechange事件)
xhr.onreadystatechange = function() {// readyState為4表示響應完成,status為200表示請求成功if (xhr.readyState === 4 && xhr.status === 200) {// 5. 處理響應數據(通常為JSON字符串)const response = JSON.parse(xhr.responseText);console.log('請求成功:', response);} else if (xhr.readyState === 4) {// 處理錯誤狀態(如404、500)console.error('請求失敗,狀態碼:', xhr.status);}
};// 4. 發送請求(GET請求無數據,參數為null)
xhr.send(null);

2.2 核心屬性與事件解析

2.2.1 readyState:請求狀態

表示XHR對象的當前狀態,取值范圍0-4:

  • 0:未初始化(open()未調用);
  • 1:加載中(open()已調用,send()未調用);
  • 2:已加載(send()已調用,響應頭已接收);
  • 3:交互中(正在接收響應體數據);
  • 4:完成(響應已全部接收)。
2.2.2 status:HTTP狀態碼

表示服務器響應的狀態,常見值:

  • 200:請求成功;
  • 400:請求參數錯誤;
  • 404:資源未找到;
  • 500:服務器內部錯誤;
  • 304:資源未修改(使用緩存)。
2.2.3 響應數據屬性
  • responseText:服務器返回的文本數據(最常用,如JSON字符串);
  • responseXML:服務器返回的XML文檔(較少用,需服務器返回XML格式);
  • response:通用響應屬性(支持多種類型,如ArrayBuffer、Blob等)。
2.2.4 常用事件
  • readystatechangereadyState變化時觸發(傳統方式);
  • load:請求完成時觸發(無論成功或失敗,替代readystatechange的現代方式);
  • error:請求失敗時觸發(如網絡錯誤);
  • abort:調用abort()取消請求時觸發;
  • progress:接收響應數據時觸發(可用于顯示進度條)。

事件示例

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);// 加載完成(替代readystatechange)
xhr.onload = function() {if (xhr.status === 200) {console.log('請求成功:', JSON.parse(xhr.responseText));} else {console.error('請求失敗:', xhr.status);}
};// 網絡錯誤
xhr.onerror = function() {console.error('網絡錯誤,請求失敗');
};// 進度事件(接收數據時)
xhr.onprogress = function(event) {if (event.lengthComputable) {const progress = (event.loaded / event.total) * 100;console.log(`加載進度:${progress}%`);}
};xhr.send(null);

三、HTTP請求方法與數據傳遞

Ajax支持多種HTTP請求方法,最常用的是GETPOST,分別適用于獲取數據和提交數據。

3.1 GET請求:獲取數據

GET請求用于從服務器獲取數據,參數通過URL的查詢字符串(?key=value&key2=value2)傳遞。

特點

  • 參數可見(URL中),不適合敏感數據;
  • 有長度限制(不同瀏覽器限制不同,通常2KB-8KB);
  • 可被緩存(適合靜態數據);
  • 冪等(多次請求結果相同,無副作用)。

示例:帶參數的GET請求

const xhr = new XMLHttpRequest();
// 參數通過查詢字符串傳遞(需編碼特殊字符)
const params = new URLSearchParams({name: '張三',age: 25
});
// URL:https://api.example.com/user?name=張三&age=25
xhr.open('GET', `https://api.example.com/user?${params.toString()}`, true);xhr.onload = function() {if (xhr.status === 200) {console.log('用戶數據:', JSON.parse(xhr.responseText));}
};xhr.send(null);

3.2 POST請求:提交數據

POST請求用于向服務器提交數據(如表單、新增資源),參數放在請求體中傳遞。

特點

  • 參數在請求體中,不可見(相對安全,仍需加密敏感數據);
  • 無長度限制(由服務器配置決定);
  • 默認不緩存;
  • 非冪等(多次請求可能有副作用,如重復提交訂單)。

示例:提交JSON數據

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/user', true);// 設置請求頭:告訴服務器請求體格式為JSON
xhr.setRequestHeader('Content-Type', 'application/json');xhr.onload = function() {if (xhr.status === 200) {console.log('提交成功:', JSON.parse(xhr.responseText));}
};// 發送JSON格式的請求體(需轉為字符串)
const data = {name: '李四',email: 'lisi@example.com'
};
xhr.send(JSON.stringify(data));

示例:提交表單數據(application/x-www-form-urlencoded

const xhr = new XMLHttpRequest();
xhr.open('POST', 'https://api.example.com/login', true);// 設置請求頭:表單默認格式
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.onload = function() {if (xhr.status === 200) {console.log('登錄成功:', JSON.parse(xhr.responseText));}
};// 發送表單格式的請求體(key=value&key2=value2)
const formData = new URLSearchParams();
formData.append('username', 'admin');
formData.append('password', '123456');
xhr.send(formData.toString());

3.3 其他請求方法

GETPOST外,RESTful API常用的方法還有:

  • PUT:更新資源(全量更新);
  • PATCH:更新資源(部分更新);
  • DELETE:刪除資源。

使用方式與POST類似,只需在open()中指定對應方法:

// PUT請求:更新用戶信息
xhr.open('PUT', 'https://api.example.com/user/123', true);// DELETE請求:刪除用戶
xhr.open('DELETE', 'https://api.example.com/user/123', true);

四、Ajax的高級特性

4.1 同步與異步請求

open()方法的第三個參數async控制請求是否異步:

  • async: true(默認):異步請求,請求發送后繼續執行后續代碼,不阻塞頁面;
  • async: false:同步請求,請求發送后會阻塞頁面,直到響應完成(不推薦,影響用戶體驗)。

同步請求示例(不推薦)

const xhr = new XMLHttpRequest();
// 同步請求(async: false)
xhr.open('GET', 'https://api.example.com/data', false);xhr.send(null);// 同步請求中,send()后立即獲取響應(無需事件監聽)
if (xhr.status === 200) {console.log('同步請求結果:', JSON.parse(xhr.responseText));
}

4.2 請求超時設置

通過timeout屬性設置請求超時時間(毫秒),超時后觸發ontimeout事件。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/slow-data', true);// 設置超時時間為5秒
xhr.timeout = 5000;// 超時處理
xhr.ontimeout = function() {console.error('請求超時,請重試');
};xhr.onload = function() {if (xhr.status === 200) {console.log('請求成功');}
};xhr.send(null);

4.3 取消請求

通過abort()方法取消正在進行的請求,觸發onabort事件。

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);xhr.onabort = function() {console.log('請求已取消');
};xhr.send(null);// 2秒后取消請求
setTimeout(() => {xhr.abort();
}, 2000);

五、跨域問題與解決方案

由于瀏覽器的同源策略(Same-Origin Policy),Ajax默認不允許請求不同域名、端口或協議的資源,否則會出現跨域錯誤。

5.1 同源策略的限制

同源指協議、域名、端口三者完全相同:

  • 允許:http://example.comhttp://example.com/api(同源);
  • 禁止:http://example.comhttps://example.com(協議不同);
  • 禁止:http://example.comhttp://api.example.com(域名不同);
  • 禁止:http://example.com:80http://example.com:8080(端口不同)。

5.2 跨域解決方案

5.2.1 CORS(Cross-Origin Resource Sharing,推薦)

服務器端設置響應頭Access-Control-Allow-Origin允許指定域名訪問:

// 服務器響應頭
Access-Control-Allow-Origin: https://example.com  // 允許example.com跨域訪問
Access-Control-Allow-Origin: *  // 允許所有域名(不推薦,不安全)

客戶端無需額外配置,直接發送請求即可:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.other-domain.com/data', true);
xhr.onload = function() {// 服務器已配置CORS,可正常接收響應
};
xhr.send(null);
5.2.2 JSONP(僅支持GET請求,兼容性好)

利用<script>標簽不受同源策略限制的特性,通過動態創建<script>標簽加載跨域腳本,執行回調函數傳遞數據。

客戶端示例

// 定義回調函數(全局函數)
function handleJsonpData(data) {console.log('JSONP獲取的數據:', data);
}// 創建script標簽,加載跨域資源
const script = document.createElement('script');
// URL中指定回調函數名,服務器會返回"handleJsonpData(數據)"
script.src = 'https://api.other-domain.com/jsonp?callback=handleJsonpData';
document.body.appendChild(script);// 加載完成后移除script標簽
script.onload = function() {document.body.removeChild(script);
};

服務器返回數據格式(需配合):

// 服務器返回的內容(會被瀏覽器當作JS執行)
handleJsonpData({ name: '張三', age: 25 });

六、常見問題與避坑指南

6.1 跨域錯誤(No ‘Access-Control-Allow-Origin’ header)

原因:請求的域名與當前頁面域名不同,且服務器未配置CORS。

解決方案

  • 開發環境:使用代理服務器(如Webpack Dev Server的proxy配置);
  • 生產環境:服務器配置Access-Control-Allow-Origin響應頭;
  • 兼容舊瀏覽器:使用JSONP(僅GET請求)。

6.2 響應數據解析錯誤(JSON.parse失敗)

原因:服務器返回的不是合法JSON字符串(如HTML、錯誤信息)。

解決方案

  • 先檢查xhr.responseText的內容,確認是否為JSON;
  • 添加錯誤處理:
xhr.onload = function() {try {const data = JSON.parse(xhr.responseText);console.log('解析成功', data);} catch (error) {console.error('JSON解析失敗:', xhr.responseText);}
};

6.3 POST請求被瀏覽器轉為OPTIONS請求

原因:跨域POST請求且請求頭包含非簡單頭(如Content-Type: application/json)時,瀏覽器會先發送預檢請求(OPTIONS),檢查服務器是否允許跨域。

解決方案

  • 服務器需處理OPTIONS請求,返回允許的請求方法、請求頭:
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Max-Age: 86400  // 預檢請求緩存時間(24小時)

Ajax的替代方案
Ajax徹底改變了網頁的交互方式,使前端從靜態展示邁向動態交互。核心價值在于異步數據交互,無需刷新頁面即可更新內容。
雖然XHR是Ajax的基礎,但現代開發中更常用以下方案:

  • Fetch API:基于Promise的新一代網絡請求API,語法更簡潔;
  • Axios:封裝了XHR的第三方庫,支持Promise、攔截器、取消請求等,簡化開發。

Fetch API示例(替代XHR):

fetch('https://api.example.com/data').then(response => {if (!response.ok) {throw new Error(`HTTP錯誤,狀態碼:${response.status}`);}return response.json(); // 解析JSON}).then(data => console.log('Fetch獲取數據:', data)).catch(error => console.error('請求失敗:', error));

若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ

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

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

相關文章

ArcGIS 打開 nc 降雨量文件

1. 打開ArcToolbox&#xff0c;依次打開 多維工具 → 創建 NetCDF 柵格圖層&#xff0c;將 nc 文件拖入 輸入 NetCDF 文件輸入框&#xff0c;確認 X維度&#xff08;經度&#xff09;、Y維度&#xff08;經度&#xff09; 的變量名是否正確&#xff0c;點擊 確定。圖 1 加載nc文…

01-elasticsearch-搭個簡單的window服務-ik分詞器-簡單使用

1、elasticsearch下載地址 如果是其他版本可以嘗試修改鏈接中的版本信息下載 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.6.2-windows-x86_64.zip 2、ik分詞器下載地址 ik分詞器下載的所有版本地址&#xff1a;Index of: analysis-ik/stable/…

[數據結構與算法] 優先隊列 | 最小堆 C++

下面是關于 C 中 std::priority_queue 的詳細說明&#xff0c;包括初始化、用法和常見的應用場景。什么是 priority_queue&#xff1f; priority_queue&#xff08;優先隊列&#xff09;是 C 標準庫中的一個容器適配器。它和普通隊列&#xff08;queue&#xff09;最大的不同在…

零基礎入門物聯網-遠程門禁開關:硬件介紹

一、成品展示 遠程門禁最終效果 二、項目介紹 整個項目主要是實際使用案例為主&#xff0c;根據自己日常生活中用到物聯網作品為原型&#xff0c;通過項目實例快速理解。項目分為兩部分&#xff1a;制作體驗和深入學習。 制作體驗部分 會提供所有項目資料及制作說明文檔&a…

軟件系統國產化改造開發層面,達夢(DM)數據庫改造問題記錄

本系統前&#xff08;vue&#xff09;后端(java spring boot)為列子&#xff0c;數據庫由MySQL--->DM&#xff08;達夢&#xff09;&#xff0c;中間件為中創的國產化相關軟件&#xff0c;如tomcat、nginx、redis等。重點講數據庫及代碼端的更改&#xff0c;中間件在服務端以…

N8N與Dify:自動化與AI的完美搭配

“N8N”和“Dify”這兩個工具徹底理清楚&#xff0c;它們其實是兩個定位完全不同的開源平臺&#xff0c;各自擅長解決不同類型的問題&#xff0c;但也能協同工作。以下是詳細說明&#xff1a;1. n8n&#xff1a;工作流自動化平臺定位&#xff1a;n8n 是一個專注于跨系統連接與任…

ARM匯編編程(AArch64架構)課程 - 第5章函數調用規范

目錄AAPCS64調用約定參數傳遞規則返回值規則棧幀管理SP寄存器FP寄存器 (X29)棧幀布局示例AAPCS64調用約定 ARM Architecture Procedure Call Standard for 64-bit (AAPCS64) 參數傳遞規則 參數位置寄存器分配特殊規則參數1-8X0-X7 (64-bit) / W0-W7 (32-bit)浮點數使用 V0-V7參…

軟考(軟件設計師)軟件工程-成本評估模型,軟件能力成熟度,軟件配置管理

成本評估模型 Putnam 下面通過一個具體案例&#xff0c;逐步說明Putnam模型的計算過程。我們將開發一個銀行核心交易系統&#xff0c;規模為80萬行代碼&#xff08;LOC&#xff09;&#xff0c;要求24個月內交付。參數符號值說明軟件規模L800,000 LOC通過功能點轉換獲得開發時間…

SASSNet復現

復現結果–Dice&#xff1a;89.354614&#xff0c;Jaccard&#xff1a;80.968917&#xff0c;95HD&#xff1a;7.3987764&#xff0c;誤差在接受范圍 MethodDiceJaccardJaccard # 感想 第19篇完全復現的論文

大數據學習5:網站訪問日志分析

1.數據處理1.1 環境準備進入cd /opt/server/hadoop-3.1.0/sbin文件夾&#xff0c;停止hdfs服務cd /opt/server/hadoop-3.1.0/sbin ./stop-dfs.sh進入/opt/server/hadoop-3.1.0/etc/hadoop文件夾&#xff0c;編輯yarn-site.xml文件/opt/server/hadoop-3.1.0/etc/hadoop vim yarn…

力扣1310. 子數組異或查詢

這一題很明顯的就是用前綴和異或來解決&#xff0c;只要清楚異或的性質&#xff0c;這一題就十分容易。 對異或的性質的講解如下&#xff1a; 異或運算解析 具體代碼如下&#xff1a; class Solution { public:int sum[30005]; vector<int> xorQueries(vector<int>…

React Native 狀態管理方案全面對比

React Native 狀態管理方案全面對比 在 React Native 開發中&#xff0c;狀態管理是構建復雜應用的核心問題。以下是主流狀態管理方案的深度對比分析&#xff1a; 一、基礎方案&#xff1a;useState/useReducer 適用場景 簡單的組件級狀態中等復雜度的局部狀態管理不需要跨組件…

基于Python的程序員數據分析與可視化系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主項目介紹背景意義項目展示總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主 項目介紹 互聯網技術飛速發展&#xff0c;數據分析與可視化在程序員工…

Java 枚舉詳解:從基礎到實戰,掌握類型安全與優雅設計

作為一名Java開發工程師&#xff0c;在日常開發中你一定經常使用枚舉&#xff08;enum&#xff09;。自Java 5引入以來&#xff0c;枚舉已經成為定義固定集合常量的首選方式&#xff0c;它比傳統的 public static final 常量更加類型安全、可讀性強&#xff0c;并且具備面向對象…

海外盲盒系統:技術如何重構“信任經濟”?

盲盒的“非透明性”易引發信任危機&#xff0c;而海外盲盒系統通過技術手段構建了“可感知的公平”&#xff1a;1. 區塊鏈存證&#xff1a;概率透明化 隱藏款概率、抽盒記錄上鏈存證&#xff0c;用戶可隨時查詢歷史數據。某歐美用戶通過區塊鏈瀏覽器驗證&#xff0c;確認系統隱…

PyTorch Tensor 操作入門:轉換、運算、維度變換

目錄 1. Tensor 與 NumPy 數組的轉換 1.1 Tensor 轉換為 NumPy 數組 1.2 NumPy 數組轉換為 Tensor 1.3 獲取單個元素的值 2. Tensor 的基本運算 2.1 生成新 Tensor 的運算 2.2 覆蓋原 Tensor 的運算 2.3 阿達瑪積&#xff08;逐元素乘法&#xff09; 2.4 矩陣乘法 3.…

CompletableFuture使用詳解(Super Detailed)

一、 CompletableFuture介紹 多線程開發一般使用Runnable&#xff0c;Callable&#xff0c;Thread&#xff0c;FutureTask&#xff0c;ThreadPoolExecutor&#xff0c;但也有不近如意的地方 Thread Runnable&#xff1a;執行異步任務&#xff0c;沒有返回結果。 Thread Calla…

開源 Arkts 鴻蒙應用 開發(六)數據持久--文件和首選項存儲

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

【Bluedroid】藍牙協議棧控制器能力解析與核心功能配置機制(decode_controller_support)

本文圍繞Bluedroid藍牙協議棧中控制器能力解析與核心功能配置的關鍵代碼展開&#xff0c;詳細闡述藍牙協議棧如何通過解析控制器硬件能力&#xff0c;構建 SCO/eSCO、ACL 數據包類型支持掩碼&#xff0c;配置鏈路策略、安全服務、查詢與掃描模式等核心功能。這些機制確保協議棧…

小架構step系列07:查找日志配置文件

1 概述 日志這里采用logback&#xff0c;其為springboot默認的日志工具。其整體已經被springboot封裝得比較好了&#xff0c;扔個配置文件到classpath里就能夠使用。 但在實際使用中&#xff0c;日志配置文件有可能需要進行改動&#xff0c;比如日志的打印級別&#xff0c;平…