最近在学习AJAX,下面这个例子返回的responseXML总是为空。
下面是构造的一个ajax对象ContentLoader:
1
var net=new Object();
2
net.READY_STATE_UNINITIALIZED=0;
3
net.READY_STATE_LOADING=1;
4
net.READY_STATE_LOADED=2;
5
net.READY_STATE_INTERACTIVE=3;
6
net.READY_STATE_COMPLETE=4;
7
net.ContentLoader=function(url,onload,onerror)
8![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
9
this.url=url;
10
this.req=null;
11
this.onload=onload;
12
this.onerror=(onerror) ? onerror : this.defaultError;
13
this.loadXMLDoc(url);
14
}
15![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
net.ContentLoader.prototype=
{
16
loadXMLDoc:function(url)
17![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
18
if(window.XMLHttpRequest)
19![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ this.req=new XMLHttpRequest();}
20
else if(window.ActiveXObject)
21![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ this.req=new ActiveXObject("Microsoft.XMLHTTP");}
22
23
if(this.req)
24![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
26
var loader=this;
27
this.req.onreadystatechange=function()
28![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
29
loader.onReadyState.call(loader);
30
}
31
this.req.open("POST",url,true);
32
this.req.send(null);
33![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
}catch(err)
{
34
this.onerror.call(this);
35
}
36
}
37
},
38
onReadyState:function()
39![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
40
var req=this.req;
41
var ready=req.readyState;
42
if(ready==net.READY_STATE_COMPLETE)
43![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
44
var httpstatus=req.status;
45
if(httpstatus==200||httpstatus==0)
46![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
47
this.onload.call(this);
48
}
49
else
50![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
51
this.onerror.call(this);
52
}
53
}
54
},
55
defaultError:function()
56![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
57
alert("error fetching data!"
58
+"\n\nreadyState:"+this.req.readState
59
+"\nstatus: "+this.req.status
60
+"\nheaders: "+this.req.getAllResponseHeaders());
61
}
62
}
这个是发送请求的页面:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Page Language="C#" AutoEventWireup="true" CodeBehind="DoubleCombo.aspx.cs" Inherits="WebApplication11.DoubleCombo" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無題のページ</title>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type="text/javascript" src="../ContentLoader.js">![](https://www.cnblogs.com/Images/dot.gif)
</script>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<script type="text/javascript">![](https://www.cnblogs.com/Images/dot.gif)
function FillTerritory(oElem,oTarget)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var strValue=oElem.options[oElem.selectedIndex].value;
var strParams="?q="+strValue+"&f="+oTarget.form.name+"&e="+oTarget.name;
var url="DoubleComboXML.aspx"+strParams;
new net.ContentLoader(url,FillDropDown,null);
}
function FillDropDown()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var xmlDoc = this.req.responseXML.documentElement;
var xSel = xmlDoc.getElementsByTagName('selectElement')[0];
var strFName = xSel.childNodes[0].firstChild.nodeValue;
var strEName = xSel.childNodes[1].firstChild.nodeValue;
var objDDL = document.forms[strFName].elements[strEName];
objDDL.options.length=0;
var xRows = xmlDoc.getElementsByTagName('entry');
for(var i =0;i<xRows.length;i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
var theText = xRows[i].childNodes[0].firstChild.nodeValue;
var theValue = xRows[i].childNodes[1].firstChild.nodeValue;
var option = new Option(theText,theValue);
try
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
objDDL.add(option,null);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
catch (e)
{
objDDL.add(option,-1);
}
}
}
</script>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
</head>
<body>
<form id="form1" runat="server">
<h2>Ajax Demo</h2>
<select id="ddlRegion" name="ddlRegion" onchange="FillTerritory(this,ddlTerritory)">
<option value="-1">Pick a Region</option>
<option value="1">Eastern</option>
<option value="2">Northern</option>
<option value="3">Western</option>
<option value="4">Southern</option>
</select>
<select id="ddlTerritory" name="ddlTerritory">
</select>
</form>
</body>
</html>
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
下面这个页面是被请求页面,主要用来返回请求的数据库数据:
public partial class DoubleComboXML : System.Web.UI.Page
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
protected void Page_Load(object sender, EventArgs e)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
classiccode#region classiccode
Response.ContentType = "text/xml";
string strQuery = Request.QueryString["q"];
string strForm = Request.QueryString["f"];
string strElem = Request.QueryString["e"];
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
string strSql = "Select TerritoryDescription,TerritoryID From Territories WHERE RegionID = " + strQuery + " ORDER BY TerritoryDescription";
DataTable dtOptions = FillDataTable(strSql);
StringBuilder strXML = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
strXML.Append("<selectChoice>");
strXML.Append("<selectElement>");
strXML.Append("<formName>" + strForm + "</formName>");
strXML.Append("<formElem>" + strElem + "</formElem>");
strXML.Append("</selectElement>");
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (dtOptions.Rows.Count > 0)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
strXML.Append("<entry>");
strXML.Append("<optionText>Select A Territory</optionText>");
strXML.Append("<optionValue>-1</optionValue>");
strXML.Append("</entry>");
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
foreach (DataRow row in dtOptions.Rows)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
strXML.Append("<entry>");
strXML.Append("<optionText>" + row["TerritoryDescription"] + "</optionText>");
strXML.Append("<optionValue>" + row["TerritoryID"] + "</optionValue>");
strXML.Append("</entry>");
}
}
strXML.Append("</selectChoice>");
Response.Write(strXML.ToString());
Response.End(); // 郁闷的很,问题就是开始没有写这句code
#endregion
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private DataTable FillDataTable(string sql)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string strConn = "initial Catalog = Northwind;Data Source = 127.0.0.1;Integrated Security = true;";
SqlDataAdapter cmdl = new SqlDataAdapter(sql, strConn);
DataSet ds = new DataSet();
cmdl.Fill(ds);
cmdl.Dispose();
return ds.Tables[0];
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)