AJAX(Asynchronous JavaScript and XML)非新語言,而是五大技術協奏:
本質:在用戶與伺服器間加入中介層,將同步交互轉為非同步,把部分伺服器負擔轉移客戶端,利用閒置算力,降低頻寬與主機成本。
function createXMLHttpRequest() {
var req = false;
try {
if (window.ActiveXObject) { // IE
for (var i = 5; i; i--) {
try {
if (i == 2) req = new ActiveXObject("Microsoft.XMLHTTP");
else req = new ActiveXObject("Msxml2.XMLHTTP." + i + ".0");
req.setRequestHeader("Content-Type", "text/xml;charset=gb2312");
break;
} catch(e) { req = false; }
}
} else if (window.XMLHttpRequest) { // 標準瀏覽器
req = new XMLHttpRequest();
if (req.overrideMimeType) req.overrideMimeType('text/xml');
}
} catch(e) { req = false; }
return req;
}
req.open('GET', url, true):第三參數 true 表示非同步(AJAX 的「A」)。req.onreadystatechange = callback:註冊狀態變更回調。req.send(null):發送請求,控制權立即歸還瀏覽器。readyState == 4(完成)且 status == 200(HTTP OK),方可處理回應。reg.163.com/register/checkssn.jsp?username=xxxreq.responseText 取得字串,寫入頁面 div#message。pass.kingsoft.com/ksgweb/jsp/login/uid.jsp?uid=xxx<isExistedUid><result>-2</result></isExistedUid>(-2 未註冊,-1 已註冊)req.responseXML 解析 DOM:var response = req.responseXML.documentElement;
var result = response.getElementsByTagName('result')[0].firstChild.data;
if (result == -2) msg = "用戶名 " + username + " 尚未註冊";
else if (result == -1) msg = "對不起,用戶名 " + username + " 已經註冊";
document.getElementById('message').innerHTML = msg;
| 細節 | 說明 |
|---|---|
| HTTP 方法大寫 | 規範要求 GET/POST 大寫,否則 Firefox 等可能失敗 |
| 編碼處理 | 中文參數必須 encodeURIComponent(),伺服端對應解碼 |
| MIME Type | 伺服端回應 XML 需設 Content-Type: text/xml;charset=UTF-8 |
| 快取控制 | GET 請求易被瀏覽器快取,加隨機參數 ?_=timestamp 避免 |
| 錯誤處理 | 回調中補充 status >= 400、timeout、abort 邏輯 |
演示使用現成門戶端點,實際專案需自建後端:
AJAX 客戶端基礎應用並不神秘,核心在於 XMLHttpRequest 生命週期掌控與回應解析。結合 CSS 動畫、JS 模板引擎、現代框架,可構建極致流暢的交互體驗。拋磚引玉,期待讀者融會貫通,創造屬於自己的 Web 2.0 應用。