JS无限树状列表实现代码


Posted in Javascript onJanuary 11, 2011

tree.js

/******************************** 
树形组织框架列表 
v1.0 
2011年1月6日 
作者:flycrosscloud 
********************************/ 
//初始化框架 
var allImages = { 
HasNodeClose: "<img src='image/ftv2pnode.gif'/>", //包含子节点,闭合状态(不是最后一个) 
HasNodeOpen: "<img src='image/ftv2mnode.gif'/>", //包含子节点,打开状态(不是最后一个) 
LastHasNodeClose: "<img src='image/ftv2plastnode.gif'/>", //包含子节点,闭合状态(最后一个) 
LastHasNodeOpen: "<img src='image/ftv2mlastnode.gif'/>", //包含子节点,打开状态(最后一个) 
CommonNode: "<img src='image/ftv2node.gif'/>", //不包含子节点,普通节点(不是最后一个) 
LastCommonNode: "<img src='image/ftv2lastnode.gif'/>", //不包含子节点,普通节点(最后一个) 
NodeLine: "<img src='image/ftv2vertline.gif'/>", //节点间连线 
NodeClose: "<img src='image/department.gif'/>", //节点关闭状态 
NodeOpen: "<img src='image/departmentopen.gif'/>", //节点打开状态 
NodeBlank: "<img src='image/ftv2vertlineblank.gif'/>"//空白连线 
}; 
$(function () 
{ 
$.post("http://localhost/system/asmx/wsTree.asmx/HelloWorld", function (data) { InitTree(data); }); 
}); 
function InitTree(org_data) 
{ 
var org = eval("(" + org_data + ")"); 
drawtree(org, 1, "", "#nodeTree"); 
$("#nodeTree img").bind("click", function (event) 
{ 
$(this).parent().find("ul").toggle(); }); 
} 
function drawtree(org, s, pPreLine, ulname) 
{ 
var orgLength = org.length; 
var PreLine; 
var count = s; 
for (var i = 0; i < orgLength; i++) 
{ 
var NodeImg = allImages.NodeClose; //项目前图标 
var PreNodeLine; //项目图标前连线 
//确定项目前图标 
if (org[i].ChildUnits != null)//如果包含子节点 
{ 
NodeImg = allImages.NodeOpen; 
} 
//确定图形前连线 
if ((org[i].ChildUnits != null) && (i == orgLength - 1)) 
{ 
//包含子节点并且是本层最后一个节点 
PreNodeLine = allImages.LastHasNodeOpen; 
} 
if ((org[i].ChildUnits == null) && (i == orgLength - 1)) 
{ 
//不包含子节点并且是本层最后一个节点 
PreNodeLine = allImages.LastCommonNode; 
} 
if ((org[i].ChildUnits != null) && (i != orgLength - 1)) 
{ 
//包含子节点并且不是本层最后一个节点 
PreNodeLine = allImages.HasNodeOpen; 
} 
if ((org[i].ChildUnits == null) && (i != orgLength - 1)) 
{ 
//不包含子节点并且不是本层最后一个节点 
PreNodeLine = allImages.CommonNode; 
} 
if (i == orgLength - 1) 
{ 
PreLine = pPreLine + allImages.NodeBlank; 
} 
else 
{ 
PreLine = pPreLine + allImages.NodeLine; 
} 
var temp = $("<li>" + pPreLine + PreNodeLine + NodeImg + "<a href='#'>" + org[i].unit_name + "</a></li>"); 
$(ulname).append(temp); 
if (org[i].ChildUnits != null) 
{ 
temp.append("<ul></ul>"); 
var content = temp.find("ul"); 
drawtree(org[i].ChildUnits, count + 1, PreLine,content ); 
} 
} 
}

tree.css
li 
{ 
vertical-align: middle; 
font-size: 16px; 
display: block;line-height: 22px;list-style-type: none;height: 22px;padding: 0px; margin:0px; 
} 
ul a 
{ 
height:22px; 
line-height:22px; 
color:#123231; 
text-decoration:none; 
} 
ul 
{ 
list-style-type:none; 
padding:0px; 
margin:0px; 
} 
img 
{ 
vertical-align:middle; 
cursor:pointer; 
} 
* 
{ 
padding:0px; 
margin:0px; 
}

test.htm
<html> 
<head> 
<link href="tree.css" rel="stylesheet" type="text/css" /> 
<script src="../js/jquery-1.4.4.min.js" type="text/javascript"></script> 
<script src="tree.js" type="text/javascript"></script> 
</head> 
<body> 
<ul id="nodeTree"> 
</ul> 
</body> 
</html>

测试数据格式(json)
[{"unit_id":1,"unit_name":"一级","father_unit_id":0,"ChildUnits":[{"unit_id":2,"unit_name":"二级","father_unit_id":1,"ChildUnits":[{"unit_id":3,"unit_name":"三级1","father_unit_id":2,"ChildUnits":[{"unit_id":6,"unit_name":"四级1","father_unit_id":3,"ChildUnits":null},{"unit_id":7,"unit_name":"四级2","father_unit_id":3,"ChildUnits":null}]},{"unit_id":4,"unit_name":"三级2","father_unit_id":2,"ChildUnits":[{"unit_id":8,"unit_name":"四级3","father_unit_id":4,"ChildUnits":null},{"unit_id":9,"unit_name":"四级4","father_unit_id":4,"ChildUnits":null}]},{"unit_id":5,"unit_name":"三级3","father_unit_id":2,"ChildUnits":[{"unit_id":10,"unit_name":"四级5","father_unit_id":5,"ChildUnits":null},{"unit_id":11,"unit_name":"四级6","father_unit_id":5,"ChildUnits":null}]}]},{"unit_id":12,"unit_name":"二级2","father_unit_id":1,"ChildUnits":null}]}]

本人水平有限,这么个东东想了好几天才弄出来个半成品,还有一些问题没有解决,先放上来存着备忘,也望高手指点一二。
思路:
使用嵌套<ul>标签实现,每一级用一个<ul>,有下级节点的用<li>嵌套<ul>,递归实现。刚开始全部都用<li>做成了,可发现要实现隐显实在是太麻烦。
问题:
1、在IE下显示连线有断续,CSS不熟,没搞定,我自己感觉还凑合,就懒得再搞了,呵呵。
2、隐显时前置图片要变换,还没实现,不过我感觉问题不大。
后台代码就不放了,需要的请留言,其实也很简单,就是节点的递归排序麻烦点。
显示效果:

JS无限树状列表实现代码

Javascript 相关文章推荐
Javascript中的变量使用说明
May 18 Javascript
javascript中var的重要性分析
Feb 11 Javascript
JS实现的竖向折叠菜单代码
Oct 21 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
Bootstrap CSS组件之导航(nav)
Dec 17 Javascript
js 轮播效果实例分享
Dec 28 Javascript
用原生JS实现简单的多选框功能
Jun 12 Javascript
JavaScript实现二维坐标点排序效果
Jul 18 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
JS设计模式之策略模式概念与用法分析
Feb 05 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
微信小程序框架wepy之动态控制类名
Sep 14 Javascript
jQuery UI的Dialog无法提交问题的解决方法
Jan 11 #Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
Jan 11 #Javascript
Jquery中获取iframe的代码
Jan 11 #Javascript
基于jQuery的message插件实现右下角弹出消息框
Jan 11 #Javascript
基于jquery的cookie的用法
Jan 10 #Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 #Javascript
IE6中使用position导致页面变形的解决方案(js代码)
Jan 09 #Javascript
You might like
php方法调用模式与函数调用模式简例
2011/09/20 PHP
linux命令之调试工具strace的深入分析
2013/06/03 PHP
php中有关字符串的4个函数substr、strrchr、strstr、ereg介绍和使用例子
2014/04/24 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
javascript实现的listview效果
2007/04/28 Javascript
jquery select下拉框操作的一些说明
2010/04/02 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
浅谈Vue数据响应思路之数组
2018/11/06 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
Django学习笔记之ORM基础教程
2018/03/27 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
python学生管理系统学习笔记
2019/03/19 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
python实现函数极小值
2019/07/10 Python
基于PyQT实现区分左键双击和单击
2020/05/19 Python
python tqdm实现进度条的示例代码
2020/11/10 Python
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
小学六年级学生评语
2014/04/22 职场文书
2014年安全生产大检查方案
2014/05/13 职场文书
纪念九一八事变演讲稿:青少年应树立远大理想
2014/09/14 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
结婚当天新郎保证书
2015/05/08 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书