JavaScript菜单树

OA系统,ERP系统这样的管理自动化系统。设计者们,总喜欢将菜单放在左侧。菜单太多了,分类折叠是必然的选择。这样既可以有力于菜单模块的管理,也可以方便操作。如下的一个菜单示例:

这样的菜单,我做了一个简单的。自己写了一个TheTree的类,效果还不错,贴上样式,还是杠杠的。

详细的源码可以访问我的github:

[email protected]:YeRuGeMiMi/TheTree.git

下面是我的开发过程:

1、生成菜单

我第一步写的菜单是直接硬编码在html中:

1 <ul>
2 <li><a href=‘#‘> 等待提交</a></li>
3 <li><a href=‘#‘ title=‘‘> 等待发布</a></li>
4 <li><a href=‘#‘ title=‘‘> 正式项目</a></li>
5 <li><a href=‘#‘ title=‘‘> 点此新增</a></li>
6 </ul>

可是,真是项目中因为权限控制的原因,是将这个菜单放在数据库中,根据权限来取得菜单树的。所以我想到了,能不能使用一个json保存菜单的数据,然后写个方法来生成菜单:

定义一个json:

1 var eljson=[{"name":"等待提交","link":"#"},{"name":"等待发布","link":"#"},{"name":"正式项目","link":"#"},{"name":"点此新增","link":"#"}];
2 var usjson=[{"name":"查看用户","link":"#"},{"name":"用户列表","link":"#"},{"name":"会员用户","link":"#"},{"name":"超级用户","link":"#"}];
3 var orjson=[{"name":"订单详情","link":"#"},{"name":"要货单","link":"#"},{"name":"退货单","link":"#"},{"name":"补货单","link":"#"}];

然后写一个一个TheTree的对象,定义一个生成方法:


 1 function TheTree(tlist,eljson){
2 this.list = document.querySelector(tlist);
3 this.create(eljson);
4 this.start();
5 }
6
7 //菜单的初始状态
8 TheTree.prototype.start=function(){
9 this.list.style.display="none";
10 }
11
12 //创建节点
13 TheTree.prototype.create=function(eljson){
14 if(!eljson){
15 return false;
16 }
17
18 var ul=document.createElement("ul");
19 //var eljson=eval(elements);
20 for(var i=0;i<eljson.length;i++){
21 var li=document.createElement("li");
22 var a=document.createElement("a");
23 a.setAttribute("href",eljson[i].link);
24 var text=document.createTextNode(eljson[i].name);
25 a.appendChild(text);
26 li.appendChild(a);
27 ul.appendChild(li);
28 }
29
30 this.list.appendChild(ul);
31
32 }

start方法:定义菜单块的初始状态,我设定的是隐藏的(一般也是这样的)。

create方法:创建节点的方法,遍历json取得值。

而后,只要根据json和菜单的div创建一个TheTree的对象就可以了:

1 var tt = new TheTree(".FAQlist",eljson);
2 var pp = new TheTree(".Userlist",usjson);
3 var oo = new TheTree(".Orderlist",orjson);

菜单成功被创建了!

2、菜单动作

菜单的动作无非是“隐藏”,和“显示”。所以只要写个方法来控制它们的样式就可以了。


 1 //动作
2 TheTree.prototype.jh=function(){
3 if (this.list.style.display == "none") {
4 this.list.style.display = "block";
5 this.status=true;
6 }else{
7 this.list.style.display = "none";
8 this.status=false;
9 }
10 }

做到这里,我本以为大功告成了。结果,却还有一个问题。

3、只打开一个

菜单分类之后,我需要的是:

可是,如果我的代码只写到上面这个地步,只能这样的:

为此,我想了想,突然来一个奇思妙想!

我为TheTree添加了一个属性status:

//属性状态
TheTree.prototype.status=false;

这个属性是用来记录,当前TheTree对象是否是展开的。因此,我可以讲建立所有的TheTree对象放到一个数组中:

1 var oarray=new Array();
2 oarray[0]=tt;
3 oarray[1]=pp;
4 oarray[2]=oo;

再建立一个方法,判断这个数组中,除了对象自己本身外的其他对象的状态:


 1 //只允许一个被点开
2 TheTree.prototype.open=function(objectArray){
3 for(var i = 0;i<objectArray.length;i++){
4
5 //判断对象是否是其本身
6 if (objectArray[i] === this) {
7 continue;
8 };
9
10 if (objectArray[i].status) {
11 objectArray[i].jh();4
12 };
13
14 }
15 }

调用这个open方法,就大功告成了!


 1 document.getElementById("btn").onclick=function(){
2 tt.jh();
3 tt.open(oarray);
4 };
5
6 document.getElementById("btn1").onclick=function(){
7 pp.jh();
8 pp.open(oarry);
9 };
10
11 document.getElementById("btn2").onclick=function(){
12 oo.jh();
13 oo.open(oarray);
14 }

总结

写了一下这个类,突然发现自己对JavaScript的面向对象知识生疏了,貌似我懂得太少了。写这么一个简单的类,都问了谷歌老师十几次,哎!看来要再去学习一下JavaScript面向对象的知识。

JavaScript菜单树

时间: 2024-10-10 00:55:23

JavaScript菜单树的相关文章

DWZ SSH2 菜单树--使用Struts2 标签(iterator/set/if 组合使用)

最近在研究DWZ框架,然后要写一个菜单树,后台我使用了SSH2,然后想把菜单通过后台传过来的对象展示出来. 但是,发现应用样式的时候,如果子菜单在子循环中为空的话,会多出一对空标签“<ul></ul>”,而DWZ的框架的样式,一旦发现标签<li>下出现标签“<ul></ul>”, 不论标签“<ul></ul>”里的内容是否为空,都会判断<li>为父级菜单,不是为最终的子菜单. 所以我只能在页面的父级循环中使用s

二级菜单树

两级导航菜单树jquery插件特效 作者:佳明妈 来源:jquery 特效 2012-03-22 人气:30725 两级导航菜单树jquery插件特效调用方法:$.jq51menu(#menubox,div.submenu); 这里的#menubox 是主菜单的ID,div.submenu是子菜单的ID.两级导航菜单树的样式很丑陋,懒人建站嘛,俺够懒,就懒得写好 两级导航菜单树jquery插件特效调用方法:$.jq51menu("#menubox","div.submenu&

zTree插件实现菜单树

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 6 <title>Title</title> 7 <link href="JS/tool/zT

Ztree菜单树数据回显

Ztree菜单树数据回显,分两部分查询数据: 其一: 根据实体id查询出其关联的菜单数据 其二: 查询所有的菜单数据. 然后,使用Ztree API中进行菜单数据回显的数据进行回显数据,勾选菜单复选框. 代码 1 //2.设置菜单树的全局变量 2 var setting = { 3 data : { 4 key : { 5 title : "t" 6 }, 7 simpleData : { //开启简单数据 8 enable : true, 9 } 10 }, 11 check : {

【实战】IFE的JavaScript和树

任务目的 熟练JavaScript 学习树这种数据结构的基本知识 任务描述 在页面中展现一颗二叉树的结构 提供一个按钮,显示开始遍历,点击后,以动画的形式呈现遍历的过程 二叉树的遍历算法和方式自定,前序中序后序皆可,但推荐可以提供多种算法的展示(增加多个按钮,每个按钮对应不同的算法) 当前被遍历到的节点做一个特殊显示(比如不同的颜色) 每隔一段时间(500ms,1s等时间自定)再遍历下一个节点 注意事项 如果按照示例图中展示树,可以使用flexbox布局 实现简单功能的同时,请仔细学习JavaS

递归加载菜单树

1.创建数据库表 create table system_resource ( id bigint(11) not null primary key auto_increment comment 'id', resource_name varchar(20) not null comment '资源名称', resource_name_cn varchar(20) not null comment '资源中文名', resource_parent_name varchar(20) null co

Js编写的菜单树

只需要提供这种JSON格式就ok了 其他的都可以直接引用这个代码进去 var testMenu=[ { "name": "一级菜单", "submenu": [ { "name": "二级菜单", "url": "" }, { "name": "二级菜单", "url": "" } ] }

JAVAscript——菜单下拉列表练习

下拉列表框,鼠标点击文本框,出现下拉,鼠标(离开的时候或者点击网页其他位置时)下拉列表消失.鼠标放到下拉列表的某一项上变背景色,点击下拉列表的某一项将该项的值显示在文本框内,然后下拉列表消失. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html x

简洁常用权限系统的设计与实现(一):构造权限菜单树的N(N&gt;=4)种方法

权限系统,Web开发常见标准子系统之一.结合自己的一些思考和实践,从本篇开始权限系统的设计与实现之路. 最近,重构了项目的权限菜单构造过程,向前端返回json格式的权限树. 这一篇,只是大致介绍下这个问题,并给出4种方法的整体思路,后续再分别详细介绍这4种方法,再往后介绍完整的权限系统的设计与实现. 权限表的结构: acl.parent_acl, 最重要的就是这2个字段,有了这2个字段,就可以构造一棵树了. 前端需要的json格式: "data":[{ "acl":