# Ajax的重要知識點有哪些
## 目錄
1. [Ajax概述](#ajax概述)
2. [核心工作原理](#核心工作原理)
3. [XMLHttpRequest對象詳解](#xmlhttprequest對象詳解)
4. [Fetch API對比分析](#fetch-api對比分析)
5. [跨域請求解決方案](#跨域請求解決方案)
6. [數據格式處理](#數據格式處理)
7. [錯誤處理與調試](#錯誤處理與調試)
8. [性能優化策略](#性能優化策略)
9. [安全注意事項](#安全注意事項)
10. [現代框架中的Ajax應用](#現代框架中的ajax應用)
---
## Ajax概述
### 定義與歷史背景
Asynchronous JavaScript and XML(Ajax)是2005年由Jesse James Garrett提出的技術概念,通過**異步通信機制**實現了網頁的局部刷新,徹底改變了傳統Web應用的交互模式。
### 技術特點
- **異步數據交換**:不阻塞用戶界面
- **基于標準技術**:組合使用XMLHttpRequest、DOM、JavaScript等
- **提升用戶體驗**:減少整頁刷新帶來的閃爍
### 典型應用場景
1. 表單驗證(實時校驗用戶名)
2. 無限滾動加載(社交媒體動態)
3. 自動補全搜索(Google搜索建議)
4. 購物車更新(電商網站)
---
## 核心工作原理
```mermaid
sequenceDiagram
User->>Browser: 觸發事件(點擊/滾動等)
Browser->>Server: 發送XHR/Fetch請求
Server-->>Browser: 返回JSON/XML數據
Browser->>DOM: 動態更新頁面
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data', true); // 異步請求
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
console.log(JSON.parse(xhr.responseText));
}
};
xhr.send();
屬性 | 描述 |
---|---|
readyState | 0-未初始化,1-連接建立,2-請求接收,3-處理中,4-完成 |
status | HTTP狀態碼(200成功,404未找到等) |
responseType | 指定響應格式(json/blob/arraybuffer) |
xhr.timeout = 3000;
xhr.upload.onprogress
實現文件上傳進度條xhr.abort()
取消進行中的請求fetch('/api/data')
.then(response => {
if(!response.ok) throw new Error('Network error');
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error(error));
特性 | XMLHttpRequest | Fetch API |
---|---|---|
語法范式 | 回調函數 | Promise鏈式調用 |
默認攜帶Cookie | 是 | 需要手動配置 |
請求取消 | abort() | AbortController |
流式讀取 | 不支持 | 支持Response.body |
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(payload),
credentials: 'include' // 攜帶cookie
});
瀏覽器同源策略要求:協議+域名+端口三者一致
服務端響應頭示例:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET,POST,PUT
Access-Control-Allow-Headers: Content-Type
function handleResponse(data) {
console.log(data);
}
const script = document.createElement('script');
script.src = 'http://other-domain.com/api?callback=handleResponse';
document.body.appendChild(script);
// 序列化特殊處理
JSON.stringify(data, (key, value) => {
if(typeof value === 'number') return value.toFixed(2);
return value;
});
// 大文件分塊處理
const chunks = [];
reader.onload = e => {
chunks.push(e.target.result);
if(chunks.length === total) {
const completeData = JSON.parse(chunks.join(''));
}
};
// 通過ArrayBuffer處理圖片
xhr.responseType = 'arraybuffer';
xhr.onload = () => {
const blob = new Blob([xhr.response]);
const imgUrl = URL.createObjectURL(blob);
document.getElementById('img').src = imgUrl;
};
// 使用async/await包裝
try {
const response = await fetch(url);
if(!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
const data = await response.json();
} catch (error) {
console.error('Fetch failed:', error);
Sentry.captureException(error); // 錯誤上報
}
Cache-Control: max-age=3600
// 及時釋放資源
const blobUrl = URL.createObjectURL(blob);
img.onload = () => URL.revokeObjectURL(blobUrl);
// 認證信息處理
fetch('/api', {
headers: new Headers({
'Authorization': `Bearer ${token}`,
'X-Requested-With': 'XMLHttpRequest'
})
});
useEffect(() => {
const controller = new AbortController();
axios.get('/api/data', { signal: controller.signal })
.then(res => setData(res.data))
.catch(err => {
if(!axios.isCancel(err)) setError(err.message);
});
return () => controller.abort();
}, []);
export default {
methods: {
async fetchData() {
this.loading = true;
try {
this.data = await this.$http.get('/api/data');
} finally {
this.loading = false;
}
}
}
}
Ajax技術經過多年發展已形成完整生態體系,現代Web開發中建議: 1. 簡單場景使用Fetch API 2. 復雜需求考慮axios等封裝庫 3. 始終關注安全性和性能指標 4. 保持對WebSocket、GraphQL等新技術的關注 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。