閱讀提要 AJAX,一個異步javascript和XML的縮略詞,是當今快速發展的Web開發界十分熱門的技術。在這項新技術提供巨大能力的同時,它也燃發了在"Back"按鈕問題上的不容置疑的爭論。本文作者將向你解釋怎樣在真實世界中使用AJAX以及怎樣在一個工程中評估它的價值。在你讀完本文后,你就會明白什么是AJAX,在什么情況下,為什么以及怎樣使用這項技術。
一、 簡介
AJAX,一個異步javascript和XML的縮略詞,是最近出來的技術詞語。異步意味著你可以經由超文本傳輸協議(HTTP)向一個服務器發出請求并且在等待該響應時繼續處理另外的數據。這就意味著,例如,你可以調用一個服務器端腳本來從一個數據庫中以XML方式檢索數據,把數據發送到存儲在一個數據庫的服務器腳本,或者簡單地裝載一個XML文件以填充你的Web站點而不需刷新該頁面。然而,在這項新技術提供巨大能力的同時,它也引起了在"Back"按鈕問題上的很多爭論。本文將幫助你確定在真實世界中何時使用AJAX是最佳選擇。
首先,我假定你對縮略詞javascript和XML部分有一個基本了解。盡管你能通過AJAX請求任何類型的文本文件,但是我在此主要集中討論XML。我將解釋怎樣在真實世界中使用AJAX以及怎樣在一個工程中評估它的價值。在你讀完本文后,你將會明白什么是AJAX,在什么情況下,為什么以及怎樣使用這項技術。你將要學習,在保持給用戶提供直觀體驗的同時怎樣創建對象,發出請求以及定制響應。
我已創建了一個適合于本文的示例工程(你可以下載源代碼)。這個示例實現了一個簡單的請求-它裝載一個包含頁面內容的XML文件并且分析數據以把它顯示在一個HTML頁面中。
二、 常規屬性和方法
表1和2提供了一個屬性和方法的概述-它們為Windows Internet Explorer 5,Mozilla,Netscape 7,Safari 1.2,和Opera等瀏覽器所支持。
表1屬性
屬性 | 描述 |
onreadystatechange | 當請求對象變化時該事件處理器激活。 |
readyState | 返回指示對象的當前狀態的值。 |
responseText | 來自服務器的響應串的版本。 |
responseXML | 來自服務器的響應的DOM兼容的文檔對象。 |
status | 來自服務器的響應的狀態碼。 |
statusText | 以一個字符串形式返回的狀態消息。 |
方法 | 描述 |
Abort() | 取消當前HTTP請求。 |
getAllResponseHeaders() | 檢索所有的HTTP頭值。 |
getResponseHeader("headerLabel") | 從響應體中檢索一個HTTP頭部的值。 |
open("method","URL"[,asyncFlag[,"userName"[,"password"]]]) | 初始化一個MSXML2.XMLHTTP請求,并從該請求指定方法,URL和認證信息。 |
send(content) | 發送一個HTTP請求到服務器并接收響應。 |
setRequestHeader("label", "value") | 指定一個HTTP頭的名字。 |
<body onload="makeRequest('xml/content.xml');"> <div id="copy"></div> </body> |
if(window.XMLHttpRequest) { request = new XMLHttpRequest();} else if(window.ActiveXObject) { request = new ActiveXObject("MSXML2.XMLHTTP");} |
request.onreadystatechange = onResponse; request.open("GET". url, true); request.send(null); |
值 | 描述 |
0 | 未初始化,對象沒有用數據進行初始化。 |
1 | 裝載中,對象正在裝載它的數據。 |
2 | 裝載結束,對象完成了它的數據的裝載。 |
3 | 可交互,用戶能與對象交互了,盡管它還沒有裝載結束。 |
4 | 完成,對象已經完全被初始化。 |
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."; } } |
var response = request.responseXML.documentElement; |
response.getElementsByTagName('header')[0].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; |
新聞熱點
疑難解答
圖片精選