Ajax 學習筆記
ajax 如何運作?
Ajax 立基於非同步 JavaScript 和 XML。簡單地說,Ajax 即運用非標準的
XMLHttpRequest
物件,並配合伺服器端的 Script 進行通訊。Ajax 能夠傳送並接收各種格式的資訊,其中包括 XML、HTML 和 text 檔案。
Ajax 最吸引人之處在於它的〝非同步〞性質,這意味著 Ajax 能做各種動作,而無須更新整個頁面。如此便能透過使用者的事件更新頁面的一小部分。
step 1. 發出http request
- 建立跨瀏覽器物件實體。為了使用 JavaScript 向伺服器發送 HTTP 請求,便需要一個能夠提供相關功能的類別實體(an instance of a class)。IE以ActiveX物件的方式引入,稱為
XMLHttp
,而Mozilla、Safari 及其他瀏覽器則是使用XMLHttpRequest
類別產生物件。1
2
3
4
5
6var httpRequest;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} - 決定伺服器傳回資料的處理方式,此時你只要以 onreadystatechange 這個屬性指明要處理傳回值的 JavaScript 函式名稱即可,例如:注意,指定的函式名稱後不加括號也沒有參數。這只是簡單的賦值,而非真的呼叫函數。除了指定函式名稱外,你也能用 Javascript 即時定義函式的技巧(稱為〝匿名函數〞)來定一個新的處理函式,如下:
1
httpRequest.onreadystatechange = nameOfTheFunction;
1
2
3httpRequest.onreadystatechange = function(){
// 做些事
}; - 確實發出request,此時需叫用 HTTP request 類別的 open() 及 send() 方法,如下:
1
2httpRequest.open('GET', 'http://www.example.org/some.file', true);
httpRequest.send(null);
open()做的工作是初始化一些設定
- 第一個參數是 HTTP request 的方法,也就是從 GET、POST、HEAD 等伺服器支援的方法中擇一使用。為遵循 HTTP 標準,請記得這些方法都是大寫,否則有的瀏覽器(如 Firefox)不會處理這些請求。其他可用的 HTTP request 方法的列表請參考 W3C 規格書。
- 第二個參數是請求頁面的 URL。基於安全考量,你不能叫用同網域以外的網頁。如果網域不同,則叫用 open() 時會出現「權限不足,拒絕存取」那類的錯誤。常見的錯誤多為在 domain.tld 的網站下呼叫 www.domain.tld 中的網頁,僅是一點點差別都不行。
- 第三個參數決定此 request 是否不同步進行,如果設定為 TRUE 則即使伺服器尚未傳回資料也會繼續執行其餘的程式,這也就是 AJAX 中第一個 A 代表的意義。
send() 按下時真正送出request
- send() 的參數在以 POST 發出 request 時,可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如:
name=value&anothername=othervalue&so=on
- send() 的參數在以 POST 發出 request 時,可以是任何想傳給伺服器的東西,而資料則以查詢字串的方式列出,例如:
step 2: 處理伺服器傳回的資料
傳出 request 時必須提供處理傳回值的函數名稱,這個函數是用來處理伺服器的回應。
1 |
|
那麼來看看這個函數該做些什麼。首先,它必須檢查 request 目前的狀態。如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。
1 |
|
readyState 所有可能的值如下:
- 0 (還沒開始)
- 1 (讀取中)
- 2 (已讀取)
- 3 (資訊交換中)
- 4 (一切完成)
接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可於 W3C 網站上查到,但我們要管的是 200 OK 這種狀態。
1 |
|
檢查傳回的 HTTP 狀態碼後,要怎麼處理傳回的資料就由你決定了。有兩種存取資料的方式:
整理一下httpRequest回傳的屬性
- readyState:
- 0:尚未讀取
- 1:讀取中
- 2:已下載完畢
- 3:資訊交換中
- 4:處理完畢
- Status:即HTTP協定的狀態碼
- responseText:傳回值視為字串用
- responseXML:把傳回值視為 XMLDocument 物件