|
树型菜单在很多桌面应用系统中都有非常广泛的应用,其主要优点是结构清晰,利于使用者非常清楚的知道目前自己所在的位置。但在web上树型菜单的应用因为没有理想的现成组件可以拿过来直接使用,所以一般的情况下,程序员主要是通过JavaScript来实现一些简单的树型结构菜单,但这些菜单往往都是事先定好各菜单项目,以及各菜单项目之间的层次关系,不利于扩充,一旦需要另一个菜单结构时,往往还需要重新编写,因此使用起来不是很方便。 经过对函数递归的研究,我发现这种树型菜单可以通过递归函数,使树型菜单的显示实现动态变化,并没有级数的限制。下面就是我用php,MySql,JavaScript写的一个动态树型菜单的处理代码,如果大家有兴趣的话,就和我一起来看看我是如何实现的吧:) 首先,我们需要一个数据库,在这个数据库中,我们建立以下一张表: CREATETABLEmenu( idtinyint(4)NOTNULLauto_increment, parent_idtinyint(4)DEFAULT0NOTNULL, namevarchar(20), urlvarchar(60), PRIMARYKEY(id) );
这张表中 id为索引 parent_id用来保存上一级菜单的id号,如果是一级菜单则为0 name为菜单的名称,也就是要在页面上显示的菜单内容 url如果某菜单为末级菜单,则需要指定该连接的url地址,这个字段就是用来保存此地址的,其他非末级菜单,该字段为空
好了,数据库有了,你就可以添加一些记录了,下面是我做测试的时候,使用的一些记录: INSERTINTOmenuVALUES(1,0,人事管理,); INSERTINTOmenuVALUES(2,0,通讯交流,); INSERTINTOmenuVALUES(3,1,档案管理,); INSERTINTOmenuVALUES(4,1,考勤管理,http://localhost/personal/attendance.php); INSERTINTOmenuVALUES(5,2,通讯录,); INSERTINTOmenuVALUES(6,2,网络会议,); INSERTINTOmenuVALUES(7,3,新增档案,http://localhost/personal/add_achive.php); INSERTINTOmenuVALUES(8,3,查询档案,http://localhost/personal/search_archive.php); INSERTINTOmenuVALUES(9,3,删除档案,http://localhost/personal/delete_archive.php); INSERTINTOmenuVALUES(10,5,新增通讯记录,http://localhost/communication/add_address.php); INSERTINTOmenuVALUES(11,5,查询通讯记录,http://localhost/communication/search_address.php); INSERTINTOmenuVALUES(12,5,删除通讯记录,http://localhost/communication/delete_address.php); INSERTINTOmenuVALUES(13,6,召开会议,http://localhost/communication/convence_meeting.php); INSERTINTOmenuVALUES(14,6,会议查询,http://localhost/communication/search_meeting.php); 在添加记录的时候,一定要注意,非一级菜单的parent_id一定要指定为上级菜单的ID号,否则你的菜单是不会显示出来的:)
好了!有了数据库,下面就是通过php,JavaScript把菜单从数据库中读出来,并显示出来了:) 1、JavaScript脚本: functionShowMenu(MenuID) { if(MenuID.style.display=="none") { MenuID.style.display=""; } else { MenuID.style.display="none"; } } 这个脚本很简单,就是用来响应点击某个菜单被点击的事件的。 2、CSS文件: <!--表格样式--> TD{ FONT-FAMILY:"Verdana","宋体";FONT-SIZE:12px;LINE-HEIGHT:130%;letter-spacing:1px } <!--超级连接样式--> A:link{ COLOR:#990000;FONT-FAMILY:"Verdana","宋体";FONT-SIZE:12px;TEXT-DECORATION:none;letter-spacing:1px } A:visited{ COLOR:#990000;FONT-FAMILY:"Verdana","宋体";FONT-SIZE:12px;TEXT-DECORATION:none;letter-spacing:1px } A:active{ COLOR:#990000;FONT-FAMILY:"Verdana","宋体";FONT-SIZE:12px;TEXT-DECORATION:none;letter-spacing:1px } A:hover{ COLOR:#ff0000;FONT-FAMILY:"Verdana","宋体";FONT-SIZE:12px;TEXT-DECORATION:underline;letter-spacing:1px } <!--其他样式--> .Menu{ COLOR:#000000;FONT-FAMILY:"Verdana","宋体";FONT-SIZE:12px;CURSOR:hand } 定义了一些基本的样式信息,比如字体,颜色,超级连接的样式等,如果你想改变样式的话,只要修改这里就行了!
3、下面就是我的php页面了! <html> <head> <linkhref=style.cssrel=stylesheet> <scriptlanguage="JavaScript"src="TreeMenu.js"></script> </head> <body> <?php //基本变量设置 $GLOBALS["ID"]=1;//用来跟踪下拉菜单的ID号 $layer=1;//用来跟踪当前菜单的级数 //连接数据库 $Con=MySql_connect("localhost","root",""); MySql_select_db("work"); //提取一级菜单 $sql="select*frommenuwhereparent_id=0"; $result=MySql_query($sql,$Con); //如果一级菜单存在则开始菜单的显示 if(MySql_num_rows($result)>0)ShowTreeMenu($Con,$result,$layer,$ID); //============================================= //显示树型菜单函数ShowTreeMenu($con,$result,$layer) //$con:数据库连接 //$result:需要显示的菜单记录集 //layer:需要显示的菜单的级数 //============================================= functionShowTreeMenu($Con,$result,$layer) { //取得需要显示的菜单的项目数 $numrows=sql/Index.html'>mysql_num_rows($result);
//开始显示菜单,每个子菜单都用一个表格来表示 echo"<tablecellpadding=0cellspacing=0border=0>"; for($rows=0;$rows<$numrows;$rows++) { //将当前菜单项目的内容导入数组 $menu=sql/Index.html'>mysql_fetch_array($result); [1] [2] 下一页
|