用dTree组件生成无限级导航树
程序员文章站
2022-04-27 16:20:05
...
在做管理系统时不可避免要用到导航树,这种东西只要一次做好,就可以随处运行,目前比较好的组件是dTree,原则上可以达到无限级,当然实际运行中4,5级就已经很多了,dTree的速度还是不错的,而且是JS实现,完全在客户端实现,不占用服务器资源。同时我们可以定制dTree的显示图标,那么我们就来看看怎么制作简单而又完整的导航树。
首先是下载dTree组件,本文附件中提供完整的示例,直接使用即可。下面我们先来看看dTree组件的结构:
这很简单,由一个JS文件,一个样式表文件和提供的基本图标构成,总体20几K,非常小,不占用网络流量。制作dTree的导航树时,也是一个HTML页面,那么我们就要在页面引入相关资源:
下面就是导航树内容的编写了,做一个很简单很强大的示例:
可以看出level是当前项目的层级,name就是显示的名称,ico是指定的图标,不指定时系统使用默认图标,link就是点击时进入的地址。当然非叶子节点元素一般是不需要地址的,那么不写就可以了,而叶子节点不写的话该行就是不可点击进入的效果。这是一个混合了1,2,3层的导航树。有了这些还不够,它们不能被解析,下面来看看解析的JS。
这样就可以了,主要是这里用了frame,页面的显示会在MainFrrame中显示,这是一般管理系统的结构,左侧导航树,右侧主显示区域,上侧是登录信息和模块切换,下侧就是版权声明了。
这样就能正常显示一棵树了,但是有时我们需要折叠和展开导航树,这个也很简单,如下即可:
这样就完整了,我们来看看实际的效果吧:
折叠后的效果就是:
实际中,页面代码不需要每个页面都完整写出,我们可以抽取成宏,直接调用宏即可,下面结合FreeMarker来优化一下编码结构,实际生成的效果都是一样的。
这是FreeMarker的宏定义。那么在页面如何使用呢,很简单:
后续我们会结合RBAC模型来介绍一下简单动态权限树的生成。一家之言,仅供参考,希望对使用者有用。
首先是下载dTree组件,本文附件中提供完整的示例,直接使用即可。下面我们先来看看dTree组件的结构:
这很简单,由一个JS文件,一个样式表文件和提供的基本图标构成,总体20几K,非常小,不占用网络流量。制作dTree的导航树时,也是一个HTML页面,那么我们就要在页面引入相关资源:
<head> <title>导航树</title> <meta http-equiv="Content-Type" content="text/html; charset=utf8" /> <style type="text/css">@import url('components/dtree/dtree.css');</style> <script type="text/javascript">var dtreeIconBasePath = "components/dtree";</script> <script language="javascript" src="components/dtree/dtree.js"></script> </head>
下面就是导航树内容的编写了,做一个很简单很强大的示例:
<script type="text/javascript"> var treeMenu = [ { level:1, name:"用户管理"}, { level:2, name:"用户列表", ico:"images/tico_way.gif",link:"user_list.html"}, { level:2, name:"角色管理"}, { level:3, name:"角色列表", ico:"images/tico_way.gif",link:"role_list.html"}, { level:3, name:"用户角色", ico:"images/tico_way.gif",link:"ur_list.html"}, { level:1, name:"信息管理"}, { level:2, name:"新闻管理", ico:"images/tico_way.gif",link:"news_list.html"}, { level:2, name:"公告管理", ico:"images/tico_way.gif",link:"bulletin_list.html"}, { level:1, name:"系统邮件", ico:"images/tico_way.gif"}, { level:1, name:"网络文件", ico:"images/tico_way.gif",link:"disk_list.html"} ]; </script>
可以看出level是当前项目的层级,name就是显示的名称,ico是指定的图标,不指定时系统使用默认图标,link就是点击时进入的地址。当然非叶子节点元素一般是不需要地址的,那么不写就可以了,而叶子节点不写的话该行就是不可点击进入的效果。这是一个混合了1,2,3层的导航树。有了这些还不够,它们不能被解析,下面来看看解析的JS。
<script type="text/javascript"> //建立新树 tree = new dTree('tree'); tree.config.target = "MainFrame"; tree.config.useCookies = false; var selNum = -1; var link = ""; //根目录 tree.add(0,-1,'系统管理中心', null, null, null, '', ''); var count = 0; var pLevelIdArray = new Array(); pLevelIdArray[1] = 0; var currLevel = 1; for (var i=0; i<treeMenu.length; i++) { var item = treeMenu[i]; var itemLevel = item.level; pLevelIdArray[itemLevel+1] = ++count; if (item.link!=null && item.link!="") { if (item.ico!=null) { tree.add(count, pLevelIdArray[itemLevel], item.name, item.link, null, null, item.ico, item.ico); } else { tree.add(count, pLevelIdArray[itemLevel], item.name, item.link); } } else { if (item.ico!=null) { tree.add(count, pLevelIdArray[itemLevel], item.name, null, null, null, item.ico, item.ico); } else { tree.add(count, pLevelIdArray[itemLevel], item.name); } } if (item.select) { selNum = count; link = item.link; } } document.write(tree); tree.openAll(); if (selNum != -1) { tree.openTo(selNum,true); top.document.frames["MainFrame"].location.href=link; } </script>
这样就可以了,主要是这里用了frame,页面的显示会在MainFrrame中显示,这是一般管理系统的结构,左侧导航树,右侧主显示区域,上侧是登录信息和模块切换,下侧就是版权声明了。
这样就能正常显示一棵树了,但是有时我们需要折叠和展开导航树,这个也很简单,如下即可:
<div style="display:block;margin-bottom:5px;"> 菜单控制: 【<a href="#" onclick="tree.openAll();this.blur();return false;" style="color:#333333">展开</a>】 【<a href="#" onclick="tree.closeAll();this.blur();return false;" style="color:#333333">折叠</a>】 </div>
这样就完整了,我们来看看实际的效果吧:
折叠后的效果就是:
实际中,页面代码不需要每个页面都完整写出,我们可以抽取成宏,直接调用宏即可,下面结合FreeMarker来优化一下编码结构,实际生成的效果都是一样的。
<#-- 树形控件 tree --> <#macro tree root="" display=""> <style type="text/css">@import url('components/dtree/dtree.css');</style> <script type="text/javascript">var dtreeIconBasePath = "components/dtree";</script> <script language="javascript" src="${base}/components/dtree/dtree.js"></script> <#nested> <div style="display:${display};margin-bottom:5px;">菜单控制:【<a href="javascript:void(0)" onclick="tree.openAll();this.blur();return false;" style="color:#333333">展开</a>】【<a href="javascript:void(0)" onclick="tree.closeAll();this.blur();return false;" style="color:#333333">折叠</a>】</div> <div class="dtree"> <script type="text/javascript"> //建立新树 tree = new dTree('tree'); tree.config.target = "MainFrame"; tree.config.useCookies = false; var selNum = -1; var link = ""; //根目录 tree.add(0,-1,'${root}', null, null, null, '${base}/images/tico_root.gif', '${base}/images/tico_root.gif'); var count = 0; var pLevelIdArray = new Array(); pLevelIdArray[1] = 0; var currLevel = 1; for (var i=0; i<treeMenu.length; i++) { var item = treeMenu[i]; var itemLevel = item.level; pLevelIdArray[itemLevel+1] = ++count; if (item.link!=null && item.link!="") { if (item.ico!=null) { tree.add(count, pLevelIdArray[itemLevel], item.name, item.link, null, null, item.ico, item.ico); } else { tree.add(count, pLevelIdArray[itemLevel], item.name, item.link); } } else { if (item.ico!=null) { tree.add(count, pLevelIdArray[itemLevel], item.name, null, null, null, item.ico, item.ico); } else { tree.add(count, pLevelIdArray[itemLevel], item.name); } } if (item.select) { selNum = count; link = item.link; } } document.write(tree); tree.openAll(); if (selNum != -1) { tree.openTo(selNum,true); top.document.frames["MainFrame"].location.href=link; } </script> </div> </#macro>
这是FreeMarker的宏定义。那么在页面如何使用呢,很简单:
<@p.tree root="管理中心" display="block"> <script type="text/javascript"> var treeMenu = [ { level:1, name:"用户管理"}, { level:2, name:"用户列表", ico:"images/tico_way.gif", link:"user_list.html"}, { level:2, name:"角色管理"}, { level:3, name:"角色列表", ico:"images/tico_way.gif", link:"role_list.html"}, { level:3, name:"用户角色", ico:"images/tico_way.gif", link:"ur_list.html"}, { level:1, name:"信息管理"}, { level:2, name:"新闻管理", ico:"images/tico_way.gif", link:"news_list.html"}, { level:2, name:"公告管理", ico:"images/tico_way.gif", link:"bulletin_list.html"}, { level:1, name:"系统邮件", ico:"images/tico_way.gif"}, { level:1, name:"网络文件", ico:"images/tico_way.gif", link:"disk_list.html"} ]; </script> </@p.tree>
后续我们会结合RBAC模型来介绍一下简单动态权限树的生成。一家之言,仅供参考,希望对使用者有用。
上一篇: MarRover代码重构
下一篇: 我的视频教程《中小企业OA系统》