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中的数学函数
Apr 04 Javascript
js中将多个语句写成一个语句的两种方法小结
Dec 08 Javascript
jquery实现漂亮的二级下拉菜单代码
Aug 26 Javascript
js判断当前页面在移动设备还是在PC端中打开
Jan 06 Javascript
详解Angularjs filter过滤器
Feb 06 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
May 31 Javascript
javascript获取select标签选中的值
Jun 04 Javascript
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
dts文件中删除一个node或属性的操作方法
Aug 05 Javascript
微信小程序时间戳转日期的详解
Apr 30 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
Sep 21 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 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
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php实现webservice实例
2014/11/06 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
超酷的网页音乐播放器DewPlayer使用方法
2010/12/18 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
浅谈$(document)和$(window)的区别
2015/07/15 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
JavaScript 中调用 Kotlin 方法实例详解
2017/06/09 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
5分钟快速掌握JS中var、let和const的异同
2018/09/19 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
js实现表格数据搜索
2020/08/09 Javascript
python实现合并两个数组的方法
2015/05/16 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
python re模块的高级用法详解
2018/06/06 Python
在python中画正态分布图像的实例
2019/07/08 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
幼儿园开学家长寄语
2014/01/19 职场文书
10的分与合教学反思
2014/04/30 职场文书
工人先进事迹材料
2014/12/26 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
酒会开场白大全
2015/06/01 职场文书
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
PostgreSQL数据库去除重复数据和运算符的基本查询操作
2022/04/12 PostgreSQL