關於ajax,是最近炒得非常火的一種技術,並且時下它也是非常流行。當然,它並不是什麼新技術,而是在各種已有的技術和支持機制下的一個統一。在我的項目中,偶爾也會用到AJax,用來給用戶一些無刷新的體驗。用過幾次之後,我個人決定對它的原理和運行機制做一個總結。
AJax這個名字據說是Asynchronous JavaScript + XML的簡寫,實際上,它由下列幾種技術組合而成。
1.使用CSS和XHtml來表示。
2. 使用DOM模型來交互和動態顯示。
3.使用XMLHttpRequest來和服務器進行異步通信。
4.使用Javascript來綁定和調用。
AJax的原理
XMLHttpRequest是AJax的核心機制,它是在IE5中首先引入的,是一種支持異步請求的技術。簡單的說,也就是Javascript可以及時向服務器提出請求和處理響應,而不阻塞用戶。達到無刷新的效果。
所以我們先從XMLHttpRequest講起,來看看它的工作原理。
首先,我們先來看看XMLHttpRequest這個對象的屬性。
它的屬性有:
onreadystatechange 每次狀態改變所觸發事件的事件處理程序。
responseText 從服務器進程返回數據的字符串形式。
responseXML 從服務器進程返回的DOM兼容的文檔數據對象。
status 從服務器返回的數字代碼,比如常見的404(未找到)和200(已就緒)
status Text 伴隨狀態碼的字符串信息
readyState 對象狀態值,0—未初始化 1—正在加載 2—加載完畢 3—交互 4—完成。
但是,由於各浏覽器之間存在差異,所以創建一個XMLHttpRequest對象可能需要不同的方法。這個差異主要體現在IE和其它浏覽器之間。
下面是面對不同浏覽器分別創建的XMLHttpRequest對象。
<script language="Javascript" type="text/Javascript">
var XMLHttp = false;
//創建面向IE的XMLHttpRequest對象
try
{
//使用MsXML的一個版本來創建
XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e)
{
try
{
//使用它的另外一個對象來創建
XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2)
{
XMLHttp = false;
}
}

if (!XMLHttp && typeof XMLHttpRequest != 'undefined')
{
//創建面向其它非微軟浏覽器的XMLHttpRequest對象
XMLHttp = new XMLHttpRequest();
}
</script>
這個過程分為三步,首先我們定義一個xmlHttp來引用創建的XMLHttpRequest。然後,我們嘗試在微軟的浏覽器中創建該對象,先用Msxml.XMLHTTP對象來創建,如果失敗再嘗試用Macrosoft.XMLHTTP來創建它.最後,我們面向非微軟浏覽器來創建該對象.
這樣,我們創建了一個XMLHttpRequest對象,下面我們來看如何發出一個XMLHttpRequest請求。
function executeXMLHttpRequest(callback,url)

{
//處理非微軟浏覽器的情況
if(window.XMLHttpRequest) 
{
xhr=new XMLHttpRequest();
xhr.onreadystatechange = callback;
xhr.open("Get",url,true);
xhr.send(null);
}
//處理微軟浏覽器的情況
else if(window.ActiveXObject)
{
xhr=new ActiveXObject("Macrosoft.XMLHttp");
if(xhr)

{
xhr.onreadystatechage=callback;
xhr.open("Get",url,true);
xhr.send();
}
}
function processAJaxResponse()
{
//狀態標識為已完成
if (xhr.readyState == 4)
{
//已就緒
if (xhr.status == 200)
{
502 502'votes').innerHtml = xhr.responseText;
} else
{
alert("There was a problem retrIEving the XML data:
" +
xhr.statusText);
}
}
}
就是說,一旦服務器處理完XMLHttpRequest並返回給浏覽器,用xhr.onreadystatechange指派的回調方法將自動調用。