asp+ajax版四级联动菜单(数据库)
时间:2009-07-03 15:40:00
ajax.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta content="琥珀[hopesoft],http://www.10090.com" name="author">
<title>四级联动菜单[AJAX版]</title>
<style type="text/css">
body, td
{
font-family: 宋体;
font-size: 12px;
}
</style>
<script language="JavaScript">
if (window.XMLHttpRequest)
{ // Mozilla, Safari, ...
http_request = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{ // IE
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
//定义菜单级数,菜单ID数组,菜单对应字段数组
var MenuIdArr,MenuFieldArr,MenuClass;
MenuIdArr= new Array();
MenuFieldArr=new Array();
MenuClass=4;
MenuIdArr[1]="sel1";//下拉框名称
MenuIdArr[2]="sel2";
MenuIdArr[3]="sel3";
MenuIdArr[4]="sel4";
MenuFieldArr[1]="name" ;//字段名称;
MenuFieldArr[2]="name";
MenuFieldArr[3]="name";
MenuFieldArr[4]="name" ;
function GetResult(str,classid)
{
/*
*--------------- GetResult(str,classid) -----------------
* GetResult(str)
* 功能:通过XMLHTTP发送请求,返回结果.
* 参数:str,字符串,发送条件;classid,数字,菜单级别
* 实例:GetResult(document.all.userid.value,1);
*--------------- GetResult(str,classid) -----------------
*/
var linkurl="ajax_server.asp?classid="+classid+"&sel="+str+"&fieldname="+MenuFieldArr[classid+1]
//alert(linkurl);
http_request.open("GET",linkurl,false);
http_request.onreadystatechange =function(){UpdateMenu(http_request,classid)};
http_request.send(null);
}
//服务器端处理返回的是经过escape编码的字符串.
//在页面显示服务器查询结果
//var returntxt=unescape(http_request.responseText);
function UpdateMenu(http_request,classid) //回调函数
{
////Http就绪状态完成
//0:请求没有发出(在调用 open() 之前)。
//
// 1:请求已经建立但还没有发出(调用 send() 之前)。
//
// 2:请求已经发出正在处理之中(这里通常可以从响应得到内容头部)。
//
// 3:请求已经处理,响应中通常有部分数据可用,但是服务器还没有完成响应。
//
// 4:响应已完成,可以访问服务器响应并使用它。
if (http_request.readyState == 4)
{
if (http_request.status == 200)// 检查 HTTP 状态。我们期望的状态码是 200,它表示一切顺利
{
var returntxt=unescape(http_request.responseText);
if(returntxt.length>0)
{
document.all,ajax.innerHTML="服务器返回结果:<font color='red'>"+returntxt+"</font> [By Shmily QQ:<a href=tencent://message/?uin=362113452&Site=renyis&Menu=yes>362113452</a>]"
}
else
{
document.all,ajax.innerHTML=""
}
//通过XMLHTTP返回数据,开始构建Select.
//BuildSel(returntxt,eval("document.all."+MenuIdArr[classid+1]))
BuildSel(returntxt,document.getElementById(MenuIdArr[classid+1]))
//============更改下下级以下菜单为空==============
var kkk
for(kkk=classid+2;kkk<=MenuClass;kkk++)
{
submenu=document.getElementById(MenuIdArr[kkk])
submenu.length=1
submenu.options[0].selected=true
}
}
}
}
function BuildSel(str,sel)
{
/*
*--------------- BuildSel(str,sel) -----------------
* BuildSel(str,sel)
* 功能:通过str构建Select.
* 参数:str,字符串,由服务端返回的.有特定结构"字符串1ws,字符串2,字符串3"
* 也可为"字符串1序号ws字符串1文本,字符串2序号ws字符串2文本,字符串3序号ws字符串3文本",如本例
* 参数:sel,要构建的Select
* 实例:BuildSel(unescape(oBao.responseText),document.all.sel2)
*--------------- BuildSel(str,sel) -----------------
*/
sel.options.length=0;//先清空原来的数据.
var arrstr = new Array();
arrstr = str.split(",");
//开始构建新的Select.
sel.options.add(new Option( "-----请选择-----",""));
if(str.length>0)
{
for(var i=0;i<arrstr.length;i++)
{ //分割字符串
var subarrstr=new Array;
subarrstr=arrstr[i].split("ws");
//生成下级菜单
sel.options.add(new Option(subarrstr[1],subarrstr[0]));
}
sel.options[0].selected=true
}
}
</script>
</head>
<body>
<form name="form1" method="post" action="">
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="1" bgcolor="#CCCCCC">
<tr bgcolor="F1F1F1">
<td height="24" colspan="2" align="center">AJAX四级联动菜单</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="12%" height="24" align="center">所 在 洲:</td>
<td><select name="sel1" id="sel1" onChange="GetResult(this.value,1)">
<option value="" selected>-----请选择-----</option>
<option value="10">亚洲</option>
<option value="11">欧洲</option>
</select></td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="24" align="center">国 家:</td>
<td><select name="sel2" id="sel2" onChange="GetResult(this.value,2)">
<option value="" selected>-----请选择-----</option>
</select></td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="24" align="center">城 市:</td>
<td><select name="sel3" id="sel3" onChange="GetResult(this.value,3)">
<option value="" selected>-----请选择-----</option>
</select></td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="24" align="center">地 区:</td>
<td><select name="sel4" id="sel4">
<option value="" selected>-----请选择-----</option>
</select></td>
</tr>
<tr bgcolor="F1F1F1">
<td height="24" colspan="2" align="center" id="ajax"></td>
</tr>
</table>
<script language="javascript"> GetResult(document.getElementById("sel1").value,1)
</script>
</form>
</body>
</html>
ajax_server.asp
<% @Language="JavaScript" %>
<%
function OpenDB(sdbname)
{
/*
*--------------- OpenDB(sdbname) -----------------
* OpenDB(sdbname)
* 功能:打开数据库sdbname,返回conn对象.
* 参数:sdbname,字符串,数据库名称.
* 实例:var conn = OpenDB("database.mdb");
*--------------- OpenDB(sdbname) -----------------
*/
var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname);
var conn = Server.CreateObject("ADODB.Connection");
conn.Open(connstr);
return conn;
}
var oConn = OpenDB("ajax_data.mdb");
var sel = Request("sel");//菜单值
var classid = Request("classid") //菜单级别
var fieldname = Request("fieldname")//字段地名
var arrResult = new Array();
//var sql = "select "+fieldname+" from Demo where parentid='"+sel+"' and classid="+classid;
var sql = "select id,"+fieldname+" from Demo where parentid='"+sel+"'";
//Response.Write("alert("+sql+")")
var rs = Server.CreateObject("ADODB.Recordset");
rs.Open(sql,oConn,1,1);
while(!rs.EOF)
{
//遍历所有适合的数据放入arrResult数组中.
arrResult[arrResult.length] = rs(0).Value+"ws"+rs(1).Value;
rs.MoveNext();
}
//escape解决了XMLHTTP。中文处理的问题.
Response.Write(escape(arrResult.join(","))); //数组组合成字符串.由","字符串连接.
%>
ajax_data.mdb
表名:Demo
id自动编号
name文本
parentid文本
classid数字