什麼是 AJAX? 
   AJAX (非同步 JavaScript 和 XML) 是個新產生的術語,專為描述JavaScript的兩項強大效能.這兩項效能在多年來一直被網路開發人員所忽略,直到最近Gmail, Google suggest和google Maps的橫空出世才使人們開始意識到其重要性.
  這兩項被忽視的效能是: 
  無需重新裝載整個頁面便能向伺服器發送請求. 
  對XML文檔的解析和處理.
步驟 1 – "請!" --- 如何發送一個HTTP請求
   為了用JavaScript向伺服器發送一個HTTP請求, 需要一個具備這種功能的類執行個體. 這樣的類首先由Internet Explorer以ActiveX對象引入, 被稱為XMLHTTP. 後來Mozilla, Safari 和其他瀏覽器紛紛仿效, 提供了XMLHttpRequest類,它支援微軟的ActiveX對象所提供的方法和屬性. 
  因此, 為了建立一個跨瀏覽器的這樣的類執行個體(對象), 可以應用如下代碼: 
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
    http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
  (上例對代碼做了一定簡化,這是為瞭解釋如何建立XMLHTTP類執行個體. 實際的代碼執行個體可參閱本篇步驟3.) 
  如果伺服器的響應沒有XML mime-type header,某些Mozilla瀏覽器可能無法正常工作. 為瞭解決這個問題, 如果伺服器響應的header不是text/xml,可以調用其它方法修改該header. 
http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/xml');
  接下來要決定當收到伺服器的響應後,需要做什麼.這需要告訴HTTP請求對象用哪一個JavaScript函數處理這個響應.可以將對象的onreadystatechange屬性設定為要使用的JavaScript的函數名,如下所示: 
http_request.onreadystatechange = nameOfTheFunction; 
  注意:在函數名後沒有括弧,也無需傳遞參數.另外還有一種方法,可以在扉頁(fly)中定義函數及其對響應要採取的行為,如下所示: 
http_request.onreadystatechange = function(){
    // do the thing
};
  在定義了如何處理響應後,就要發送請求了.可以調用HTTP請求類的open()和send()方法, 如下所示: 
http_request.open('GET', 'http://www.example.org/some.file', true);
http_request.send(null);
  open()的第一個參數是HTTP請求方式 – GET, POST, HEAD 或任何伺服器所支援的您想調用的方式. 按照HTTP規範,該參數要大寫;否則,某些瀏覽器(如Firefox)可能無法處理請求.有關HTTP要求方法的詳細資料可參考http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html W3C specs 
   第二個參數是請求頁面的URL.由於自身安全特性的限制,該頁面不能為第三方網域名稱的頁面.同時一定要保證在所有的頁面中都使用準確的網域名稱,否則調用 open()會得到"permission denied"的錯誤提示.一個常見的錯誤是訪問網站時使用domain.tld,而當請求頁面時,卻使用www.domain.tld. 
  第三個參數佈建要求是否為非同步模式.如果是TRUE, JavaScript函數將繼續執行,而不等待伺服器響應.這就是"AJAX"中的"A". 
  如果第一個參數是"POST",send()方法的參數可以是任何想送給伺服器的資料. 這時資料要以字串的形式送給伺服器,如下所示: 
name=value&anothername=othervalue&so=on 
步驟 2 – "收到!" --- 處理伺服器的響應 
  當發送請求時,要提供指定處理響應的JavaScript函數名. 
http_request.onreadystatechange = nameOfTheFunction; 
  我們來看看這個函數的功能是什麼.首先函數會檢查請求的狀態.如果狀態值是4,就意味著一個完整的伺服器響應已經收到了,您將可以處理該響應. 
if (http_request.readyState == 4) {
    // everything is good, the response is received
} else {
    // still not ready
}
  readyState的取值如下: 
  0 (未初始化) 
  1 (正在裝載) 
  2 (裝載完畢) 
  3 (互動中) 
  4 (完成) 
  接著,函數會檢查HTTP伺服器響應的狀態值. 完整的狀態取值可參見 W3C site. 我們著重看值為200 OK的響應. 
if (http_request.status == 200) {
    // perfect!
} else {
    // there was a problem with the request,
    // for example the response may be a 404 (Not Found)
    // or 500 (Internal Server Error) response codes
}
  在檢查完請求的狀態值和響應的HTTP狀態值後, 您就可以處理從伺服器得到的資料了.有兩種方式可以得到這些資料: 
http_request.responseText – 以文本字串的方式返回伺服器的響應 
http_request.responseXML – 以XMLDocument對象方式返迴響應.處理XMLDocument對象可以用JavaScript DOM函數 
步驟 3 – "萬事俱備!" - 簡單一實例
  我們現在將整個過程完整地做一次,發送一個簡單的HTTP請求. 我們用JavaScript請求一個HTML檔案, test.html, 檔案的常值內容為"I'm a test.".然後我們"alert()"test.html檔案的內容. 
<script type="text/javascript" language="javascript">
    var http_request = false;
    function makeRequest(url) {
        http_request = false;
        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }
        if (!http_request) {
            alert('Giving up Cannot create an XMLHTTP instance');
            return false;
        }
        http_request.onreadystatechange = alertContents;
        http_request.open('GET', url, true);
        http_request.send(null);
    }
    function alertContents() {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                alert(http_request.responseText);
            } else {
                alert('There was a problem with the request.');
            }
        }
    }
</script>
<span
    style="cursor: pointer; text-decoration: underline"
    onclick="makeRequest('test.html')">
        Make a request
</span>
  本例中: 
  使用者點擊瀏覽器上的"請求"連結; 
  接著函數makeRequest()將被調用.其參數 – HTML檔案test.html在同一目錄下; 
  這樣就發起了一個請求.onreadystatechange的執行結果會被傳送給alertContents(); 
  alertContents()將檢查伺服器的響應是否成功地收到,如果是,就會"alert()"test.html檔案的內容. 
步驟 4 – "X-文檔" --- 處理XML響應
  在前面的例子中,當伺服器對HTTP請求的響應被收到後,我們會調用請求對象的reponseText屬性.該屬性包含了test.html檔案的內容.現在我們來試試responseXML屬性. 
  首先,我們建立一個有效XML檔案,後面我們將使用這個檔案.該檔案(test.xml)原始碼如下所示: 
<?xml version="1.0" ?>
<root>
    I'm a test.
</root>
  在該指令碼中,我們只需修改請求部分: 
...
onclick="makeRequest('test.xml')">
...
  接著,在alertContents()中,我們將alert()的代碼alert(http_request.responseText);換成: 
  var xmldoc = http_request.responseXML;
  var root_node = xmldoc.getElementsByTagName('root').item(0);
  alert(root_node.firstChild.data);
 
  這裡,我們使用了responseXML提供的XMLDocument對象並用DOM方法擷取存於XML檔案中的內容.