深入理解AJAX響應(yīng)信息的處理
請(qǐng)求狀態(tài) 該AJAX對(duì)象的請(qǐng)求狀態(tài)與被請(qǐng)求文件的HTTP狀態(tài)是一樣的。包含在AJAX文件中的HTTP對(duì)象處理了所有的W3C描述的HTTP狀態(tài)代碼定義,并把它們返回給請(qǐng)求方法。狀態(tài)代碼被分成了五個(gè)部分: · 信息的 1xx · 成功的 2xx · 重定向 3xx · 客戶端錯(cuò)誤 4xx · 服務(wù)器錯(cuò)誤 5xx 上面的數(shù)字中的最前面一位表示某種類別的狀態(tài)代碼。例如,成功的是2xx,它的意思是包含了200-299之間的所有狀態(tài)代碼。HTTP對(duì)象檢查狀態(tài)代碼的第一位數(shù)字,并根據(jù)代碼所屬的類別,執(zhí)行一次轉(zhuǎn)換。在檢測(cè)出類別之后,HTTP對(duì)象把它發(fā)送給響應(yīng)方法,該方法把狀態(tài)代碼作為字符串的形式返回。這就是HTTP狀態(tài)方法: this.status = function(_status) { var s = _status.toString().split(""); switch(s[0]) { case "1": return this.getInformationalStatus(_status); break; case "2": return this.getSuccessfulStatus(_status); break; case "3": return this.getRedirectionStatus(_status); break; case "4": return this.getClientErrorStatus(_status); break; case "5": return this.getServerErrorStatus(_status); break; } } 狀態(tài)代碼是通過檢測(cè)該代碼的第一位數(shù)字來處理的。一旦完成了代碼檢測(cè),原始的狀態(tài)代碼就被發(fā)送到一個(gè)適當(dāng)?shù)姆椒ㄖ校摲椒ńoonResponse方法發(fā)送一個(gè)字符串形式的狀態(tài)代碼。接著我們就可以把這條消息顯示給用戶,如果遇到了什么錯(cuò)誤,她/他就知道發(fā)生了什么情況。另一方面,如果請(qǐng)求是成功的,那么就顯示數(shù)據(jù)。 ResponseText和ResponseXML 響應(yīng)信息的內(nèi)容可能有多種不同的形式,例如XML、純文本、(X)HTML或JavaScript對(duì)象符號(hào)(JSON)。我們可以根據(jù)所接收到的數(shù)據(jù)格式的不同,用兩種不同的方法來處理:使用responseText或者responseXML。responseText方法用于那些并非基于XML的格式。它把響應(yīng)信息作為字符串,返回精確的內(nèi)容。純文本、(X)HTML和JSON都使用responseText。在純文本或HTML上使用這個(gè)方法是很簡(jiǎn)單的: if(ajax.checkReadyState('body', 'loading...', 'loading...', 'loading...') == "OK") { document.getElementById('body').innerHTML = ajax.request.responseText; } 它最簡(jiǎn)單不過了!一旦載入響應(yīng)信息完成,我們就調(diào)用AJAX對(duì)象,用responseText來檢索它的值,并把它添加到頁(yè)面上。 處理JSON響應(yīng)信息比處理純文本或(X)HTML需要多一點(diǎn)技巧。下面是我們分析一個(gè)JSON文件的示例: { 'header' : 'How to Handle the Ajax Response', 'description' : 'An in-depth explanation of how to handle the Ajax response.', 'sourceUrl' : 'http://www.krishadlock.com/clients/informit/AjaxResponse/AjaxResponse.zip'} 數(shù)據(jù)被冒號(hào)(:)分成了兩個(gè)部分:標(biāo)簽名稱和值。附加的數(shù)據(jù)被逗號(hào)(,)分成新的名稱/值對(duì)。現(xiàn)在我們知道了JSON的樣子了,下面是我們分析它的方法: if(ajax.checkReadyState('body', 'loading...', 'loading...', 'loading...') == "OK") { eval("var response = ("+ajax.request.responseText+")"); document.getElementById('body').innerHTML = "" + response.header + "" + response.description + "
" + "Download the source files"; } JSON數(shù)據(jù)首先由JavaScript來分析(使用簡(jiǎn)單的eval()過程)。一旦數(shù)據(jù)被分析好了并建立了響應(yīng)信息對(duì)象,我們就可以簡(jiǎn)單地通過名字來獲取它們的響應(yīng)信息值。 responseText不僅可以給頁(yè)面添加內(nèi)容,它在調(diào)試AJAX請(qǐng)求的時(shí)候也有用處。例如,你可能還沒有準(zhǔn)備好分析數(shù)據(jù),因?yàn)槟氵€不知道所有的標(biāo)簽是什么樣的,是XML格式的還是JSON文件。這就要求有一種用于檢測(cè)被分析數(shù)據(jù)的途徑。一旦你知道了所有的標(biāo)簽名稱,所需要做的事情就只是編寫代碼了。 responseXML的使用也相當(dāng)簡(jiǎn)單。但是與JSON格式類似,XML要求進(jìn)行數(shù)據(jù)分析。我們需要執(zhí)行的第一項(xiàng)事務(wù)是識(shí)別出XML響應(yīng)信息中的根節(jié)點(diǎn)。 var response = ajax.request.responseXML.documentElement; 下一步,我們通過名稱獲取所有的元素并得到它們的值: var header = response.getElementsByTagName('header')[0].firstChild.data; var description = response.getElementsByTagName('description')[0].firstChild.data; var sourceUrl = response.getElementsByTagName('sourceUrl')[0].firstChild.data; 最后,我們把響應(yīng)信息顯示在相應(yīng)的div標(biāo)記中: document.getElementById('body').innerHTML = "" + header + "
" + description + "
" + "Download the source files"; 用JavaScript的時(shí)候,JSON比XML要快一些,這是因?yàn)镴SON所需要的分析代碼比XML少很多,直接導(dǎo)致在分析大量數(shù)據(jù)的時(shí)候,JSON的速度較快。JSON不如XML的地方在于XML受到的支持更大、服務(wù)器端開發(fā)選項(xiàng)更多。你可以根據(jù)環(huán)境和請(qǐng)求的用途來做出選擇。 AJAX響應(yīng)信息是AJAX通訊中的一個(gè)重要的部分。你需要處理很多方面的信息,包括就緒狀態(tài)、錯(cuò)誤處理和加載狀態(tài),并最終顯示出來。有了這些信息之后,你就可以把注意力集中在響應(yīng)信息上,為用戶提供更多的信息。
posted on 2006-03-15 12:29 寶鈺 閱讀(84) 評(píng)論(0) 編輯 收藏