原理是这样的,首先读出第一个顶级节点,然后循环读出该节点的下级节点,并控制缩进
显示,一般是用表格加层的方式来做的,除了顶级节点外,其余节点都设置为不可见,即
层不可见。重复上述过程,直到完成所有节点的输出。当用户点击一个节点时,执行脚本
:如果有一下级节点,显示下级节点所在的层,如果下级节点已经显示,则隐藏。叶子节
点没有事件,则直接指向一上链接,当然也可以为它写事件。下面是一个例子,没有使用
层,直接用了表格的行来显示和隐藏节点。
<%@language=VBScript%>
<%
option explicit
dim conn,rs,strtemp,i,connstring
dim rs1,rs2
'创建ADO对象
set conn=server.CreateObject("ADODB.connection")
'连接到数据库
connstring="Provider = Microsoft.Jet.OLEDB.4.0;
Data Source =" &
server.MapPath("dbsys.mdb")
conn.Open connstring
%>
<html><head>
<title>MenuTree</title>
<script language="JavaScript">
function treeclick(f)
{
if (f.style.display=='none')
{
f.style.display='';
}
else
{
f.style.display='none';
}
}
</script>
<STYLE type=text/css>
BODY {FONT-FAMILY: 宋体,MS Sans Serif,Courier New;
FONT-SIZE: 9pt}
TD {FONT-SIZE: 9pt}
TR {FONT-SIZE: 9pt}
A:link {COLOR: Navy;
TEXT-DECORATION: none}
A:visited {COLOR: Navy;
TEXT-DECORATION: none}
A:hover {COLOR: Red;
TEXT-DECORATION: underline}
</style>
</head>
<body bgcolor="rgb(255,255,235)">
<%
'取出并显示数据
set rs=conn.Execute("select * from systemlist order by id")
if not rs.eof then
rs.MoveFirst
'循环1:取出系统列表
'-----1-----
do
while not rs.EOF
Response.Write("<table border=0>")
Response.Write("<tr><td>")
Response.Write("<img src='note.gif' border=0 valign=middle>&nbsp;<a href='#' onmouseup='treeclick(" &
rs("name") &
");return false;'>")
Response.Write(rs("csname"))
Response.Write("</a>")
Response.Write("</td></tr>")
Response.Write("<tr id='" &
rs("name") &
"' style='display:none;LINE-HEIGHT: 0.7'><td>")
strtemp="select * from application where xtname='" &
rs("id") &
_
"' and menulevel='0' order by bm"
set rs1=conn.Execute(strtemp)
if not rs1.eof then
rs1.movefirst
'循环2:取出当前系统的一级菜单
'-----2-----
do
while not rs1.eof
%>
<font color=ForestGreen>│</font><br>
<font color=ForestGreen>└</font>&nbsp;<a href="main.asp?id=<%=rs1("id")%>" target="MainFrame"><%=rs1("menuname")%></a><br>
<%
Response.Write(chr(13))
rs1.movenext
loop
'-----/2-----
Response.Write("</td></tr>")
Response.Write("</table>")
rs.MoveNext
loop
'-----/1-----
%>