这个是后台管理的动态创建的菜单,比较难,不过,仔细揣摩还是比较简单的,所以,直接上代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="div"></div>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
var zNodes=[
{code:0,pId:-1,name:"Aaaa"},
{code:1,pId:0,name:"主页"},
{code:11,pId:1,name:"A1"},
{code:111,pId:11,name:"A11"},
{code:12,pId:1,name:"A2"},
{code:13,pId:1,name:"A3"},
{code:2,pId:0,name:"文章管理"},
{code:21,pId:2,name:"用户管理"},
{code:22,pId:2,name:"角色管理"},
{code:23,pId:2,name:"权限管理"},
{code:3,pId:0,name:"C"},
{code:31,pId:3,name:"C1"},
{code:32,pId:3,name:"C2"},
{code:33,pId:3,name:"C3"},
{code:34,pId:31,name:"x"},
{code:35,pId:31,name:"y"},
{code:36,pId:31,name:"z"},
{code:37,pId:36,name:"z1123"},
{code:38,pId:37,name:"z123123123"},
{code:381,pId:38,name:"z1231231234"},
];
function treeMenu(a){
this.tree=a||[];
this.groups={};
};
treeMenu.prototype={
init:function(pid){
this.group();
return this.getDom(this.groups[pid]);
},
group:function(){
for(var i=0;i<this.tree.length;i++){
if(this.groups[this.tree[i].pId]){
//console.log(this.groups[this.tree[i].pId]);
this.groups[this.tree[i].pId].push(this.tree[i]);
}else{
this.groups[this.tree[i].pId]=[];
this.groups[this.tree[i].pId].push(this.tree[i]);
console.log(this.groups[this.tree[i].pId]);
}
}
},
getDom:function(a){
if(!a){return ''}
var html='
<ul >
';
for(var i=0;i<a.length;i++){
html+='<li><span>'+a[i].name+'</span>';
//html+='<li><a href="#">'+a[i].name+'</a>';
html+=this.getDom(this.groups[a[i].code]);
html+='</li>
';
};
html+='</ul>
';
return html;
}
};
var html=new treeMenu(zNodes).init(0);
$("#div").html(html);
</script>
</body>
</html>
配上这张图看代码的话,可能更加好理解这段代码。

下面这一种和前一种的区别就是他们的数据结构不一样,导致实现代码的逻辑也不一样。不过,下面这一种方式复杂的工作全部交给了后台,基本上没有前端什么事情了。