Ajax(Asynchronous JavaScript and XML)讓網頁無需刷新即可與服務器交互。核心對象是 XMLHttpRequest(XHR),現代瀏覽器均支援,IE5/6 需用 ActiveXObject。本文從底層創建、核心方法、封裝函數到完整 PHP 交互示例,手把手帶你入門。
function createXHR() {
if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Safari, Opera
return new XMLHttpRequest();
}
// IE5/6
try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) {}
try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {}
throw new Error('XMLHttpRequest not supported');
}
| 屬性/方法 | 說明 |
|---|---|
open(method, url, async) | 初始化請求:GET/POST、URL、是否異步(true) |
send(data) | 發送請求:GET 傳 null,POST 傳字符串/FormData |
onreadystatechange | 就緒狀態改變事件處理器 |
readyState | 0=未初始化 1=已open 2=已發送 3=接收中 4=完成 |
status | HTTP 狀態碼:200 成功、404 不存在、500 服務器錯誤 |
responseText | 響應文本內容 |
responseXML | 響應 XML Document 對象 |
setRequestHeader(name, value) | 設置請求頭(POST 需 Content-Type: application/x-www-form-urlencoded) |
getResponseHeader(name) | 獲取響應頭 |
function ajax(options) {
var xhr = createXHR();
var method = (options.method || 'GET').toUpperCase();
var url = options.url;
var data = options.data || null;
var async = options.async !== false;
if (method === 'GET' && data) {
url += (url.indexOf('?') === -1 ? '?' : '&') + serialize(data);
data = null;
}
xhr.open(method, url, async);
if (method === 'POST') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
if (options.headers) {
for (var k in options.headers) xhr.setRequestHeader(k, options.headers[k]);
}
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status >= 200 && xhr.status < 300) {
var resp = options.dataType === 'json' ? JSON.parse(xhr.responseText) : xhr.responseText;
options.success && options.success(resp, xhr);
} else {
options.error && options.error(xhr.status, xhr);
}
}
};
xhr.send(serialize(data));
return xhr;
}
function serialize(obj) {
if (!obj) return '';
var arr = [];
for (var k in obj) arr.push(encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]));
return arr.join('&');
}
<!-- test.html -->
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Ajax Demo</title></head><body>
<button onclick="loadUser(1)">載入用戶 1</button>
<button onclick="loadUser(2)">載入用戶 2</button>
<div id="result"></div>
<script>
function loadUser(id) {
ajax({
url: 'do.php',
method: 'GET',
data: { id: id },
dataType: 'json',
success: function(res) {
document.getElementById('result').innerHTML =
'<pre>' + JSON.stringify(res, null, 2) + '</pre>';
},
error: function(status) { alert('請求失敗: ' + status); }
});
}
</script>
</body></html>
<?php
// do.php
header('Content-Type: application/json; charset=utf-8');
$id = isset($_GET['id']) ? intval($_GET['id']) : 0;
$users = [
1 => ['name' => '張三', 'email' => 'zhang@example.com', 'role' => 'admin'],
2 => ['name' => '李四', 'email' => 'li@example.com', 'role' => 'user'],
];
echo json_encode($users[$id] ?? ['error' => '用戶不存在']);
var fd = new FormData(formEl); xhr.send(fd);(不手動設置 Content-Type,瀏覽器自動帶 boundary)。xhr.setRequestHeader('Content-Type','application/json'); xhr.send(JSON.stringify(obj)),PHP 端用 file_get_contents('php://input') 讀取。xhr.timeout = 5000; xhr.ontimeout = fn(IE10+)。xhr.abort()。fetch() + async/await、Axios、Ky 等庫,提供 Promise 鏈、攔截器、自動轉 JSON。json_encode + header('Content-Type: application/json')。filter_input、類型轉換、白名單。{code: 400, message: '...', data: null}。掌握原生 XHR 能讓你理解 Ajax 底層機制,排查庫無法解決的疑難雜症;實際項目建議直接使用 fetch 或成熟庫提升開發效率。