Ajax
XMLHttpRequest
AJAX引擎只是一個JavaScript的物件而以,也就是XMLHttpRequest物件。
微軟IE5最先支援這個物件,Mozilla 1.0(Netscape 7),Safari 1.2及Opera都開始支援相容的物件。 值得注意的是XMLHttpRequest物件並不是標準,只是知名的瀏覽器都相繼支援。
Adaptive Path公司的Jesse James Garrett所發表的Ajax:A New Approach to Web Applications,這篇文章替AJAX正名,也揭示了整個AJAX背後的精神與意義。
[範例]
下方程式按照流程 1.按下按鈕觸發事件 2.ajaxSendRequest() a.取得XMLHttpRequest物件 b.設定非同步傳輸完成函式 c.使用open()函式初始設定
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5"/>
<script language="Javascript">
// AJAX 物件
var ajax;
// 依據不同的瀏覽器,取得 XMLHttpRequest 物件
function createAJAX() {
if (window.ActiveXObject) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
return null;
}
}
} else if (window.XMLHttpRequest) {
return new XMLHttpRequest();
} else {
return null;
}
}
// 非同步傳輸的回應函式,用來處理伺服器回傳的資料
function onRcvData () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
var content = document.getElementById ('content');
content.innerHTML = ajax.responseText;
} else {
alert ("伺服器處理錯誤");
}
}
}
// 非同步送出資料
function ajaxSendRequest(uri) {
ajax = createAJAX() ;
if (!ajax) {
alert ('使用不相容 XMLHttpRequest 的瀏覽器');
return 0;
}
ajax.onreadystatechange = onRcvData;
ajax.open ("GET", uri, true);
ajax.send ("");
}
</script>
</head>
<body>
<div id="content"></div><br>
<input type="button" value="查詢" onclick="ajaxSendRequest('hello.php')" >
</body>
</html>
設定非同步傳輸完成函式
ajax.onreadystatechange = onRcvData;
ajax.open ("GET", uri, true);
ajax.send ("");
AJAX的精神在於非同步傳輸,固AJAX在送出請求後,並不會去等待回應,因而必須指定一個特定的函式讓XMLHttpRequest物件在接到到伺服器回應時通知JavaScript程式。
在XMLHttpRequest物件中,是透過onreadystatechange來指定這個函式。 當XMLHttpRequest物件收到回應時,會自動呼叫onreadystatechange所指定的函式去處理。
使用open()函式初始設定
open()函式原型如下:
open("method","URL"[,"asyncFlag"[,"userName"[,"password"]]])
- method參數:POST, GET
- URL參數:指定所要存取檔案的位置
- asyncFlag參數:決定採用非同步傳輸或不採用
使用send()傳輸
XMLHttpRequest的open()函式只是用來做初始化及設定參數,真正的資料傳遞是由send()負責。
取得伺服器的回應
function onRcvData () {
if (ajax.readyState == 4) {
if (ajax.status == 200) {
var content = document.getElementById ('content');
content.innerHTML = ajax.responseText;
} else {
alert ("伺服器處理錯誤");
}
}
}
當XMLHttpRequest物件收到伺服器的回應後,會設定下列屬性:
- readyState:
type | desc |
---|---|
0 | 尚未讀取 |
1 | 讀取中 |
2 | 已下載完畢 |
3 | 資訊交換中 |
4 | 處理完畢 |
- Status:即HTTP協定的狀態碼
- responseText:回應內容
- responseXML:回應內容XML格式
Url編碼
ajax注意編碼轉換
URL有中文或特殊字元請自行encodeURIComponent(),不要依賴瀏覽器自動轉換,以免因XHR處理邏輯不同產生非預期結果。
[解決方法]
var url = "/_api/Query('執行緒')/items?$filter=Category eq '黑暗'";
var oReq = new XMLHttpRequest();
oReq.open("get", url, true);
oReq.send();