Ajax 學習筆記

ajax 如何運作?

  1. Ajax 立基於非同步 JavaScript 和 XML。簡單地說,Ajax 即運用非標準的XMLHttpRequest物件,並配合伺服器端的 Script 進行通訊。

  2. Ajax 能夠傳送並接收各種格式的資訊,其中包括 XML、HTML 和 text 檔案。

  3. Ajax 最吸引人之處在於它的〝非同步〞性質,這意味著 Ajax 能做各種動作,而無須更新整個頁面。如此便能透過使用者的事件更新頁面的一小部分。

step 1. 發出http request

  1. 建立跨瀏覽器物件實體。為了使用 JavaScript 向伺服器發送 HTTP 請求,便需要一個能夠提供相關功能的類別實體(an instance of a class)。IE以ActiveX物件的方式引入,稱為XMLHttp,而Mozilla、Safari 及其他瀏覽器則是使用XMLHttpRequest類別產生物件。
    1
    2
    3
    4
    5
    6
    var httpRequest;
    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }
  2. 決定伺服器傳回資料的處理方式,此時你只要以 onreadystatechange 這個屬性指明要處理傳回值的 JavaScript 函式名稱即可,例如:
    1
    httpRequest.onreadystatechange = nameOfTheFunction;
    注意,指定的函式名稱後不加括號也沒有參數。這只是簡單的賦值,而非真的呼叫函數。除了指定函式名稱外,你也能用 Javascript 即時定義函式的技巧(稱為〝匿名函數〞)來定一個新的處理函式,如下:
    1
    2
    3
    httpRequest.onreadystatechange = function(){
    // 做些事
    };
  3. 確實發出request,此時需叫用 HTTP request 類別的 open() 及 send() 方法,如下:
    1
    2
    httpRequest.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

step 2: 處理伺服器傳回的資料

傳出 request 時必須提供處理傳回值的函數名稱,這個函數是用來處理伺服器的回應。

1
httpRequest.onreadystatechange = nameOfTheFunction;

那麼來看看這個函數該做些什麼。首先,它必須檢查 request 目前的狀態。如果狀態值為 4 代表伺服器已經傳回所有資訊了,便可以開始解析所得資訊。

1
2
3
4
5
if (httpRequest.readyState == 4) {
// 一切 ok, 繼續解析
} else {
// 還沒完成
}

readyState 所有可能的值如下:

  • 0 (還沒開始)
  • 1 (讀取中)
  • 2 (已讀取)
  • 3 (資訊交換中)
  • 4 (一切完成)

接下來要檢查伺服器傳回的 HTTP 狀態碼。所有狀態碼列表可於 W3C 網站上查到,但我們要管的是 200 OK 這種狀態。

1
2
3
4
5
if (httpRequest.status == 200) {
// 萬事具備
} else {
// 似乎有點問題,或許伺服器傳回了 404 (查無此頁) 或者 500 (內部錯誤) 什麼的
}

檢查傳回的 HTTP 狀態碼後,要怎麼處理傳回的資料就由你決定了。有兩種存取資料的方式:

整理一下httpRequest回傳的屬性

  • readyState:
    • 0:尚未讀取
    • 1:讀取中
    • 2:已下載完畢
    • 3:資訊交換中
      • 4:處理完畢
  • Status:即HTTP協定的狀態碼
  • responseText:傳回值視為字串用
  • responseXML:把傳回值視為 XMLDocument 物件

參考資料

延伸閱讀

評論