與 responseText 以字符串返回 HTTP 響應(yīng)不同,responseXML 以 XML 返回響應(yīng)。
ResponseXML 屬性返回 XML 文檔對(duì)象,可使用 W3C DOM 節(jié)點(diǎn)樹的方法和屬性來檢查和解析該對(duì)象。
在下面的 AJAX 實(shí)例中,我們將演示網(wǎng)頁(yè)如何使用 AJAX 技術(shù)從數(shù)據(jù)庫(kù)中讀取信息。這次,這些從數(shù)據(jù)庫(kù)中選取的數(shù)據(jù)將被轉(zhuǎn)換為 XML 文檔,然后我們將使用 DOM 來提取要顯示的值。
上面的例子包含一個(gè) HTML 表單,若干個(gè)保留所返回?cái)?shù)據(jù)的 <span> 元素,以及指向一段 JavaScript 的鏈接:
<html> <head><script src="selectcustomer_xml.js"></script>
</head> <body><form action="">
<label>選擇客戶: <selectname="customers" onchange="showCustomer(this.value)"
> <option value="ALFKI">Alfreds Futterkiste</option> <option value="NORTS ">North/South</option> <option value="WOLZA">Wolski Zajazd</option> </select></label></form>
<b><span id="companyname"></span></b><br /> <span id="contactname"></span><br /> <span id="address"></span> <span id="city"></span><br/> <span id="country"></span> </body> </html>
上面的例子包含了一個(gè) HTML 表單,該表單帶有一個(gè)名為 "customers" 下拉框。
當(dāng)用戶選取下拉框中的客戶時(shí),函數(shù) "showCustomer()" 就會(huì)被執(zhí)行。事件 "onchange" 會(huì)觸發(fā)該函數(shù)執(zhí)行。換句話說,每當(dāng)用戶改變下拉框中的值時(shí),函數(shù) showCustomer() 就會(huì)被調(diào)用。
下面列出了 JavaScript 代碼。
這是存儲(chǔ)在文件 "selectcustomer_xml.js" 中的 JavaScript 代碼:
var xmlHttp function showCustomer(str) { xmlHttp=GetXmlHttpObject(); if (xmlHttp==null) { alert ("Your browser does not support AJAX!"); return; } var url="getcustomer_xml.asp"; url=url+"?q="+str; url=url+"&sid="+Math.random(); xmlHttp.onreadystatechange=stateChanged; xmlHttp.open("GET",url,true); xmlHttp.send(null); } function stateChanged() { if (xmlHttp.readyState==4) { var xmlDoc=xmlHttp.responseXML.documentElement; document.getElementById("companyname").innerHTML= xmlDoc.getElementsByTagName("compname")[0].childNodes[0].nodeValue; document.getElementById("contactname").innerHTML= xmlDoc.getElementsByTagName("contname")[0].childNodes[0].nodeValue; document.getElementById("address").innerHTML= xmlDoc.getElementsByTagName("address")[0].childNodes[0].nodeValue; document.getElementById("city").innerHTML= xmlDoc.getElementsByTagName("city")[0].childNodes[0].nodeValue; document.getElementById("country").innerHTML= xmlDoc.getElementsByTagName("country")[0].childNodes[0].nodeValue; } } function GetXmlHttpObject() { var xmlHttp=null; try { // Firefox, Opera 8.0+, Safari xmlHttp=new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp; }
showCustomer() 和 GetXmlHttpObject() 與上一節(jié)相同。stateChanged() 函數(shù)稍早前也在本教程中使用過。不過,這次我們通過 responseXML 以 XML 文檔返回結(jié)果,并使用 DOM 來提取要顯示的值。
這個(gè)被 JavaScript 調(diào)用的服務(wù)器頁(yè)面,是名為 "getcustomer_xml.asp" 的簡(jiǎn)單 ASP 文件。
該頁(yè)面使用 VBScript 編寫,針對(duì) Internet 信息服務(wù)器 (IIS)?梢杂 PHP 或其他服務(wù)器語(yǔ)言,簡(jiǎn)單地重寫該頁(yè)面。
請(qǐng)看在 PHP 中對(duì)應(yīng)的例子(測(cè)試:缺具體頁(yè)面)。
這段代碼執(zhí)行針對(duì)數(shù)據(jù)庫(kù)的 SQL 查詢,并以 XML 文檔返回結(jié)果:
<% response.expires=-1 response.contenttype="text/xml" sql="SELECT * FROM CUSTOMERS " sql=sql & " WHERE CUSTOMERID='" & request.querystring("q") & "'" on error resume next set conn=Server.CreateObject("ADODB.Connection") conn.Provider="Microsoft.Jet.OLEDB.4.0" conn.Open(Server.Mappath("/db/northwind.mdb")) set rs=Server.CreateObject("ADODB.recordset") rs.Open sql, conn if err <> 0 then response.write(err.description) set rs=nothing set conn=nothing else response.write("<?xml version='1.0' encoding='ISO-8859-1'?>") response.write("<company>") response.write("<compname>" &rs.fields("companyname")& "</compname>") response.write("<contname>" &rs.fields("contactname")& "</contname>") response.write("<address>" &rs.fields("address")& "</address>") response.write("<city>" &rs.fields("city")& "</city>") response.write("<country>" &rs.fields("country")& "</country>") response.write("</company>") end if on error goto 0 %>
請(qǐng)注意上面的 ASP 代碼中的第二行:response.contenttype="text/xml"。ContentType 屬性為 response 對(duì)象設(shè)置了 HTTP 內(nèi)容類型。該屬性的默認(rèn)值是 "text/html"。這次我們把內(nèi)容類型設(shè)置為 XML。
然后我們從數(shù)據(jù)庫(kù)中選取數(shù)據(jù),并使用這些數(shù)據(jù)構(gòu)建 XML 文檔。