树型菜单在很多桌面应用系统中都有非常广泛的应用其主要优点是结构清晰利于使用者非常清楚的知道目前自己所在的位置但在web上树型菜单的应用因为没有理想的现成组件可以拿过来直接使用所以一般的情况下程序员主要是通过JavaScript来实现一些简单的树型结构菜单但这些菜单往往都是事先定好各菜单项目以及各菜单项目之间的层次关系不利于扩充一旦需要另一个菜单结构时往往还需要重新编写因此使用起来不是很方便
经过对函数递归的研究我发现这种树型菜单可以通过递归函数使树型菜单的显示实现动态变化并没有级数的限制下面就是我用phpMySQLJavaScript写的一个动态树型菜单的处理代码如果大家有兴趣的话就和我一起来看看我是如何实现的吧)
首先我们需要一个数据库在这个数据库中我们建立以下一张表
CREATE TABLE menu (
id tinyint() NOT NULL auto_increment
parent_id tinyint() DEFAULT NOT NULL
name varchar()
url varchar()
PRIMARY KEY (id)
);
这张表中 id 为索引
parent_id 用来保存上一级菜单的id号如果是一级菜单则为
name 为菜单的名称也就是要在页面上显示的菜单内容
url 如果某菜单为末级菜单则需要指定该连接的url地址这个字段就是用来保存此地址的其他非末级菜单该字段为空
好了数据库有了你就可以添加一些记录了下面是我做测试的时候使用的一些记录
INSERT INTO menu VALUES ( 人事管理 );
INSERT INTO menu VALUES ( 通讯交流 );
INSERT INTO menu VALUES ( 档案管理 );
INSERT INTO menu VALUES ( 考勤管理 );
INSERT INTO menu VALUES ( 通讯录 );
INSERT INTO menu VALUES ( 网络会议 );
INSERT INTO menu VALUES ( 新增档案 );
INSERT INTO menu VALUES ( 查询档案 );
INSERT INTO menu VALUES ( 删除档案 );
INSERT INTO menu VALUES ( 新增通讯记录);
INSERT INTO menu VALUES ( 查询通讯记录 );
INSERT INTO menu VALUES ( 删除通讯记录 );
INSERT INTO menu VALUES ( 召开会议 );
INSERT INTO menu VALUES ( 会议查询 );
在添加记录的时候一定要注意非一级菜单的parent_id一定要指定为上级菜单的ID号否则你的菜单是不会显示出来的)
好了!有了数据库下面就是通过phpJavaScript把菜单从数据库中读出来并显示出来了)
JavaScript脚本
function ShowMenu(MenuID)
{
if(MenuIDstyledisplay==none)
{
MenuIDstyledisplay=;
}
else
{
MenuIDstyledisplay=none;
}
}
这个脚本很简单就是用来响应点击某个菜单被点击的事件的
CSS文件 <! 表格样式 >
TD {
FONTFAMILY: Verdana 宋体; FONTSIZE: px; LINEHEIGHT: %; letterspacing:px
}
<! 超级连接样式 >
A:link {
COLOR: #; FONTFAMILY: Verdana 宋体; FONTSIZE: px; TEXTDECORATION: none; letterspacing:px
}
A:visited {
COLOR: #; FONTFAMILY: Verdana 宋体; FONTSIZE: px; TEXTDECORATION: none; letterspacing:px
}
A:active {
COLOR: #; FONTFAMILY: Verdana 宋体; FONTSIZE: px; TEXTDECORATION: none; letterspacing:px
}
A:hover {
COLOR: #ff; FONTFAMILY: Verdana 宋体; FONTSIZE: px; TEXTDECORATION: underline; letterspacing:px
}
<! 其他样式 >
Menu {
COLOR:#; FONTFAMILY: Verdana 宋体; FONTSIZE: px; CURSOR: hand
}
定义了一些基本的样式信息比如字体颜色超级连接的样式等如果你想改变样式的话只要修改这里就行了!
下面就是我的php页面了!
<html>
<head>
<link rel=stylesheet>
<script language=JavaScript src=TreeMenujs></script>
</head>
<body>
<?php
//基本变量设置
$GLOBALS[ID] =; //用来跟蹤下拉菜单的ID号
$layer=; //用来跟蹤当前菜单的级数
//连接数据库
$Con=mysql_connect(localhostroot);
mysql_select_db(work);
//提取一级菜单
$sql=select * from menu where parent_id=;
$result=mysql_query($sql$Con);
//如果一级菜单存在则开始菜单的显示
if(mysql_num_rows($result)>) ShowTreeMenu($Con$result$layer$ID);
//=============================================
//显示树型菜单函数 ShowTreeMenu($con$result$layer)
//$con数据库连接
//$result需要显示的菜单记录集
//layer需要显示的菜单的级数
//=============================================
function ShowTreeMenu($Con$result$layer)
{
//取得需要显示的菜单的项目数
$numrows=mysql_num_rows($result);
//开始显示菜单每个子菜单都用一个表格来表示
echo <table cellpadding= cellspacing= border=>;
for($rows=;$rows<$numrows;$rows++)
{
//将当前菜单项目的内容导入数组
$menu=mysql_fetch_array($result);
//提取菜单项目的子菜单记录集
$sql=select * from menu where parent_id=$menu[id];
$result_sub=mysql_query($sql$Con);
echo <tr>;
//如果该菜单项目有子菜单则添加JavaScript onClick语句
if(mysql_num_rows($result_sub)>)
{
echo <td width=><img src=foldergif border=></td>;
echo <td class=Menu onClick=javascript:ShowMenu(Menu$GLOBALS[ID]);>;
}
else
{
echo <td width=><img src=filegif border=></td>;
echo <td class=Menu>;
}
//如果该菜单项目没有子菜单并指定了超级连接地址则指定为超级连接
//否则只显示菜单名称
if($menu[url]!=)
echo <a $menu[url]>$menu[name]</a>;
else
echo $menu[name];
echo
</td>
</tr>
;
//如果该菜单项目有子菜单则显示子菜单
if(mysql_num_rows($result_sub)>)
{
//指定该子菜单的ID和style以便和onClick语句相对应
echo <tr id=Menu$GLOBALS[ID]++ style=display:none>;
echo <td width=></td>;
echo <td>;
//将级数加
$layer++;
//递归调用ShowTreeMenu()函数生成子菜单
ShowTreeMenu($Con$result_sub$layer);
//子菜单处理完成返回到递归的上一层将级数减
$layer;
echo </td></tr>;
}
//继续显示下一个菜单项目
}
echo </table>;
}
?>
</body>
</html>
在上面的php页面里面我定义了一个函数ShowTreeMenu()通过这个函数的调用会从数据库中递归的调出每个菜单项目并显示在页面上了)