AJax原理

AJAX利用一個構建到所有現代瀏覽器內部的對象-XMLHttpRequest-來實現發送和接收HTTP請求與響應信息。一個經由XMLHttpRequest對象發送的HTTP請求並不要求頁面中擁有或回寄一個<form>元素。AJAX中的"A"代表了"異步",這意味着XMLHttpRequest對象的send()方法可以立即返回,從而讓Web頁面上的其它HTML/JavaScript繼續其瀏覽器端處理而由服務器處理HTTP請求併發送響應。儘管缺省情況下請求是異步進行的,但是,你可以選擇發送同步請求,這將會暫停其它Web頁面的處理,直到該頁面接收到服務器的響應爲止。

  微軟在其Internet Explorer(IE) 5中作爲一個ActiveX對象形式引入了XMLHttpRequest對象。其他的認識到這一對象重要性的瀏覽器製造商也都紛紛在他們的瀏覽器內實現了XMLHttpRequest對象,但是作爲一個本地JavaScript對象而不是作爲一個ActiveX對象實現。而如今,在認識到實現這一類型的價值及安全性特徵之後,微軟已經在其IE 7中把XMLHttpRequest實現爲一個窗口對象屬性。幸運的是,儘管其實現(因而也影響到調用方式)細節不同,但是,所有的瀏覽器實現都具有類似的功能,並且實質上是相同方法。目前,W3C組織正在努力進行XMLHttpRequest對象的標準化,並且已經發行了有關該W3C規範的一個草案。

XMLHttpRequest是Ajax技術體系中最爲核心的技術。缺少了它,Ajax的其餘技術就無法成爲一個有機的整體,將會土崩瓦解。現在W3C已經將其列入了工作草案,應該很快就會成爲正式的標準。
目前在IE 5.0、IE 6.0中創建XMLHttpRequest對象的語法如下:
  var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  而在非IE瀏覽器中創建XMLHttpRequest對象的語法如下:
var xmlhttp = new XMLHttpRequest();
當IE 7.0普及之後,創建XMLHttpRequest對象將可以使用完全相同的語法。
  XMLHttpRequest與服務器通信有兩種方式:同步方式和異步方式。同步方式的調用非常簡單,但是僅僅適用於數據量非常少的場合。如果數據量很大,會造成用戶界面很長一段時間的停頓,這當然會損害Web應用的可用性。爲了不影響可用性,Ajax應用中一般都使用異步方式來與服務器通信。用來設置同步和異步方式的是XMLHttpRequest對象的open方法的第3個參數,這個參數爲true代表異步,爲false代表同步。例如:
  xmlhttp.open("GET", "http://www.blogjava.net/dlee/Rss.aspx", true);
  如果是使用異步方式來進行通信,還需要設置一個回調函數,當數據返回時系統會調用這個回調函數。通過爲XMLHttpRequest對象的onreadystatechange屬性賦值來設置一個回調函數:
  xmlhttp.onreadystatechange=function() {...};


二、 XMLHttpRequest對象的屬性和事件

  XMLHttpRequest對象暴露各種屬性、方法和事件以便於腳本處理和控制HTTP請求與響應。下面,我們將對此展開詳細的討論。
readyState屬性

  當XMLHttpRequest對象把一個HTTP請求發送到服務器時將經歷若干種狀態:一直等待直到請求被處理;然後,它才接收一個響應。這樣以來,腳本才正確響應各種狀態-XMLHttpRequest對象暴露一個描述對象的當前狀態的readyState屬性,如表格1所示。

  表格1.XMLHttpRequest對象的ReadyState屬性值列表。
ReadyState取值    描述
0     描述一種"未初始化"狀態;此時,已經創建一個XMLHttpRequest對象,但是還沒有初始化。
1     描述一種"發送"狀態;此時,代碼已經調用了XMLHttpRequest open()方法並且XMLHttpRequest已經準備好把一個請求發送到服務器。
2     描述一種"發送"狀態;此時,已經通過send()方法把一個請求發送到服務器端,但是還沒有收到一個響應。
3     描述一種"正在接收"狀態;此時,已經接收到HTTP響應頭部信息,但是消息體部分還沒有完全接收結束。
4     描述一種"已加載"狀態;此時,響應已經被完全接收。

  onreadystatechange事件

  無論readyState值何時發生改變,XMLHttpRequest對象都會激發一個readystatechange事件。其中,onreadystatechange屬性接收一個EventListener值-向該方法指示無論readyState值何時發生改變,該對象都將激活。

  responseText屬性

  這個responseText屬性包含客戶端接收到的HTTP響應的文本內容。當readyState值爲0、1或2時,responseText包含一個空字符串。當readyState值爲3(正在接收)時,響應中包含客戶端還未完成的響應信息。當readyState爲4(已加載)時,該responseText包含完整的響應信息。

  responseXML屬性

  此responseXML屬性用於當接收到完整的HTTP響應時(readyState爲4)描述XML響應;此時,Content-Type頭部指定MIME(媒體)類型爲text/xml,application/xml或以+xml結尾。如果Content-Type頭部並不包含這些媒體類型之一,那麼responseXML的值爲null。無論何時,只要readyState值不爲4,那麼該responseXML的值也爲null。

  其實,這個responseXML屬性值是一個文檔接口類型的對象,用來描述被分析的文檔。如果文檔不能被分析(例如,如果文檔不是良構的或不支持文檔相應的字符編碼),那麼responseXML的值將爲null。

  status屬性

  這個status屬性描述了HTTP狀態代碼,而且其類型爲short。而且,僅當readyState值爲3(正在接收中)或4(已加載)時,這個status屬性纔可用。當readyState的值小於3時試圖存取status的值將引發一個異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章