2011年6月17日 星期五

AJAX基礎運作說明

我在找AJAX基礎文章,但是我慧根不夠,老是有看沒有懂。參考兩本書對照之後,總算理出一點頭緒。趁著還有一點印象之前,我用我能理解的方式,做個筆記紀錄一下,免得以後要用時又忘了。


傳統的網頁請求模式,是將整個頁面傳送回Server。而Server整理用戶端的回應後,將整個頁面再全部傳送回給用戶端。


AJAX請求模式,用戶端只有要請求的資料,透過XHR(XMLHttpRequest)這個物件傳送到Server,不再是整個頁面。


Server也不再將整個頁面做回應,它只將要回應的資料,透過XHR送回用戶端。 而XHR擺在頁面上的甚麼地方,就只有那個地方會產生回應資料。大幅減少資料頁面回應的更新。


 
如果上面還看不懂,舉例來說:


你的電腦風扇壞了,因為你不懂如何修電腦,只好將整台電腦搬到維修公司更換風扇,然後再整台搬回來。

後來,你請了一個助手,他懂如何修電腦。風扇再次壞掉,他只要到維修公司去買了一個風扇回來更換,你的電腦就修好了。XHR就是這位助手。


目前各大瀏覽器及伺服器都支援XHR物件,若XHR執行有問題,先檢查瀏覽器或伺服器是否太舊,導致無法執行。


XHR基本使用方式:

1. 產生一個XHR物件

2. 將用戶端請求,利用XHR物件傳送到Server

3. Server收到後產生回應,將結果回傳。

以下的範例是,當你按下一個按鈕後,XHR會呼叫abc.txt文字檔案,並將內容產生於螢幕上:

============

<html>
<head>
<title>XMLHttpRequest Test</title>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">   
<script type="text/javascript">

//一、這是一個產生XHR物件標準的函式,檢查瀏覽器是否
//支援ActiveX的XHR物件,若不支援,則使用JavaScript原
//生XHR物件。

var xmlHttp;
function createXMLHttpRequest() {
    if (window.ActiveXObject) {
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    else if (window.XMLHttpRequest) {
        xmlHttp = new XMLHttpRequest();
    }
}  


//二、這個函式是當用戶端按下按鈕時,XHR會開啟abc.txt檔案

function startRequest()
{
    createXMLHttpRequest();
    xmlHttp.onreadystatechange = handleStateChange;
    xmlHttp.open("GET", "abc.txt", true);  
    xmlHttp.send(null);  
}

//三、XHR會在Server回應readyState == 4(完成),status = 200
//(HTTP對應OK)後,因為是文字檔,以”responseText”方法,將
//資料產生在名為”disp”的ID上。

function handleStateChange()
{
    if(xmlHttp.readyState == 4) {
        if(xmlHttp.status == 200) {           
         document.getElementById("disp").innerHTML=xmlHttp.responseText;        
        }
    }
}
</script>
</head>
<body>
   <form action="#">
   <input type="button" value="click me" onClick="startRequest();" />
   <div id="disp"></div>
   </form>
</body>
</html>

===========

將範例搞清楚後,再查看網路上XHR所提供的其他方法及屬性,應該就比較清楚如何應用了。

我還在努力了解AJAX中,一起加油吧。