<body >
<div id="copy"></div>
</body>
if(window.XMLHttpRequest)
{ request = new XMLHttpRequest();}
else if(window.ActiveXObject)
{ request = new ActiveXObject("MSXML2.XMLHTTP");}
五、 發出請求
現在既然你已經創建了你的請求對象,那麼你已經為向服務器發出請求作了准備。創建一個到事件處理器的參考以聽取onreadystatechange事件。然後,該事件處理器方法將在狀態發生變化時作出響應。一旦我們完成請求,我們就開始創建這個方法。打開連接以GET或POST一個定制的URL-在此是一個content.XML,並且設置一個布爾定義-是否你想要進行異步調用。
現在到了發出請求的時間了。在這個示例中,我使用了null,因為我們使用的是GET;為了使用POST,你需要使用下面這個方法發出一個查詢串:request.onreadystatechange = onResponse;
request.open("GET". url, true);
request.send(null);
六、 定制加載和錯誤處理消息
你為onreadystatechange方法創建的事件處理器正是集中進行加載和處理錯誤的場所。現在到了考慮用戶並針對他們與之交互的內容的狀態提供反饋的時候了。在這個實例中,我針對所有的裝載狀態代碼提供反饋,並且也對最經常發生的錯誤處理狀態代碼提供一些基本的反饋。為了顯示請求對象的當前狀態,readyState屬性包括顯示在下表中的一些值。值 描述0 未初始化,對象沒有用數據進行初始化。1 裝載中,對象正在裝載它的數據。2 裝載結束,對象完成了它的數據的裝載。3 可交互,用戶能與對象交互了,盡管它還沒有裝載結束。4 完成,對象已經完全被初始化。
W3C中有很長的一串有關HTTP狀態代碼的定義。我選擇了兩個狀態代碼:
·200:請求成功了。
·404:服務器沒有找到與所請求的文件相匹配的任何東西。
最後,我檢查任何另外的狀況代碼-它們將生成一個錯誤並提供一個一般錯誤信息。下面是一個代碼示例-你可以用之來處理這些情況。注意,我在定位我們前面在HTML文件的主體中創建的div ID並且對它應用裝載和/或錯誤信息-通過innerHTML方法-這個方法用於設置在div對象的開始和結束標簽之間的Html:if(obj.readyState == 0)
{ document.getElementById('copy').innerHtml = "Sending Request...";}
if(obj.readyState == 1)
{ document.getElementById('copy').innerHtml = "Loading Response...";}
if(obj.readyState == 2)
{ document.getElementById('copy').innerHtml = "Response Loaded...";}
if(obj.readyState == 3)
{ document.getElementById('copy').innerHtml = "Response Ready...";}
if(obj.readyState == 4){
if(obj.status == 200){ return true; }
else if(obj.status == 404)
{
// 添加一個定制消息或把用戶重定向到另外一個頁面
document.getElementById('copy').innerHtml = "File not found";
}
else
{document.getElementById('copy').innerHtml = "There was a problem retrIEving the XML."; }
}
當狀況代碼為200時,這意味著請求成功。下面開始進行響應了。
七、 分析響應
當你准備好分析來自請求對象的響應時,真正的工作開始了。現在你可以用你請求的數據開始工作。僅為測試目的,在開發期間,可以使用responseText和responseXML屬性來顯示來自響應的原始數據。為了存取XML響應中的結點,首先使用你創建的請求對象,定位到responseXML屬性以檢索(你可能已經猜測出來)來自響應的XML。定位到documentElement-它檢索一個到XML響應的根結點的參考。var response = request.responseXML.documentElement;
現在既然你有了到響應的根結點的參考,那麼你可以使用getElementsByTagName()以結點名字來檢索childNodes。下面一行用一個頭部的nodeName來定位一個childNode:response.getElementsByTagName('header')[0].firstChild.data;
使用firstChild.data可以允許你存取該元素中的文本:response.getElementsByTagName('header')[0].firstChild.data;
下面是怎樣創建這些代碼的完整的例子:var response = request.responseXML.documentElement;
var header = response.getElementsByTagName('header')[0].firstChild.data;
document.getElementById('copy').innerHtml = header;
八、 需求分析
現在既然你知道怎樣使用AJax的基礎知識,那麼下一步就是決定是否在一工程使用它。須記住的最重要的事情是,在你還沒有刷新頁面時你無法使用"Back"按鈕。為此,可以先專注於你的工程中的一小部分-它能夠從使用這種類型的交互中受益。例如,你可以創建一個表單-它在用戶每次輸入一個輸入字段或一個字母時查詢一個腳本以便進行實時校驗。你可以創建一個拖放頁面-在釋放一項時,它能夠把數據發送到一個腳本中並把該頁面的狀態保存到一個數據庫中。使用AJax的理由毫無疑問是存在的;並且這種使用無論對開發者還是用戶都會帶來益處;這全依賴於具體的條件和執行情況。
還有其它方法可用來解決"Back"按鈕的問題,例如使用Google Gmail-它現在能夠為你的操作提供一種撤消功能而不刷新該頁面。以後還會出現許多更具創造性的例子-它們將通過提供給開發者創建獨特實時的體驗的手段給用戶帶來更大的好處。
九、 結論
盡管AJax允許我們構建新的和改進的方式來與一個WEB頁面進行交互;但是作為開發者,我們需要牢記產品是不考慮技術的;它關心的是用戶以及其如何與用戶進行交互。沒有了用戶群,我們構建的工程毫無用處。基於這個標准,我們就能評估應該使用什麼技術以及何時使用它們來創建對相應用戶有用的應用軟件。