纯jsp打造无限层次的树
来源:互联网 发布:linux more指令 编辑:程序博客网 时间:2024/05/22 07:09
很多人在开发中遇到过这样的问题:一个表,有自己编号,内容,上级编号,如何用这些数据在jsp中构造一个树?
做树并不复杂,但我们通常做的是2层或3层,那样的数据一般来自多个表,比如:部门,员工
然而这种自连接的表,其没有确定的层次,可能是无限多级
比如:a是b的上级,b是c的上级,c是d的上级...
每个上级有几个下级,下级的层次,都是动态的
解决这个问题,其实主要用到js的知识
可以使用div的innerHTML属性
当然也可以用table,用append的方法
下面就用div的innerHTML属性来实现
主要思路是通过super,在document中查找id与自身super关联的div,这个div就是自身的上级,把自己附加到这个div中就可以了
另外,通过设置自己的title,保存了自己上级的id
为了看到层层缩进效果,设置了div的style为左边距有10px
+ 和 - 通过div中的span实现,这里改变的是span的innerHTML,也可以换为用图片,改变img的src即可
而在点击这些 + 或 - 的时候,会调用一个js函数,传入自己的id,这个函数会在document的所有div中查找自己的下级,由于每个div的title保存了其上级的id,所以只有找到那些title为自己id的就可以了
找到这些下级,就设置其隐藏或显示即可
<%@ page language="java" import="java.sql.*,java.util.*" pageEncoding="gbk" contentType="text/html; charset=gbk" isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
//模拟数据库的数据
//无限层次的树 -- 作者:NImmy 需要:JSTL标准标签库
//模拟数据库数据:每行数据包括--自己ID,自己内容,父亲ID
ArrayList ary = new ArrayList(); //所有数据
String[] ary1 = new String[]{"1","item1","0"}; //每行数据
ary.add(ary1);
ary1 = new String[]{"2","item2","0"};
ary.add(ary1);
ary1 = new String[]{"3","item3","0"};
ary.add(ary1);
ary1 = new String[]{"4","item1_1","1"};
ary.add(ary1);
ary1 = new String[]{"5","item1_2","1"};
ary.add(ary1);
ary1 = new String[]{"6","item1_2_1","5"};
ary.add(ary1);
ary1 = new String[]{"7","item1_2_2","5"};
ary.add(ary1);
ary1 = new String[]{"8","item2_1","2"};
ary.add(ary1);
ary1 = new String[]{"9","item2_1_1","8"};
ary.add(ary1);
ary1 = new String[]{"10","item2_2","2"};
ary.add(ary1);
ary1 = new String[]{"11","item3_1","3"};
ary.add(ary1);
ary1 = new String[]{"12","item3_2","3"};
ary.add(ary1);
request.setAttribute("lstAll",ary);
%>
<script>
//初始化树
function ini() {
var str,str2,obj;
<c:forEach items="${lstAll}" var="row">
<c:set var="isShow" value="block" />
<c:set var="sOpe" value="+" />
<c:if test="${row[2]!='0'}"> <%--非根节点不显示--%>
<c:set var="isShow" value="none" />
</c:if>
//alert("${row[2]}--${isShow}--${spe}");
obj = document.getElementById("div${row[2]}"); //上级DIV
//自身
str2 = "<div style='display:${isShow}' id='div${row[0]}' title='${row[2]}'><span id='span${row[0]}' onclick='ope(${row[0]})'>${sOpe}</span> ${row[1]}</div>";
str = obj.innerHTML; //获取上级原来的内容
str = str + str2; //附加自己
obj.innerHTML = str; //用附加后的字符串设置上级的新内容
</c:forEach>
}
//点某个节点时,展开或隐藏其下级
function ope(id) {
//首先改变 + 和 -
var obj = document.getElementById("span" + id);
if(obj.innerHTML == "+") {
obj.innerHTML = "-";
}
else {
obj.innerHTML = "+";
}
//然后找到下级[title为id的DIV],并改变其可见性
var objs = document.getElementsByTagName("div"); //获取所有的div
var len = objs.length;
//遍历这些div,找到所有的下级,即: title为id 的div,对于这些下级
//如果原来是隐藏,就让其显示;否则,隐藏--通过设置其style的display即可
var i,title;
for(i=0;i<len;i++) {
obj = objs[i];
title = obj.title;
if(title==null || isNaN(title)) {
continue;
}
if(parseInt(title)==parseInt(id)) {
if(obj.style.display=="none") {
obj.style.display = "block";
}
else {
obj.style.display = "none";
}
}
}
}
</script>
<style>
div{margin-left:10px;color:darkblue}
span{color:red;cursor:hand}
</style>
<body onload="ini();">
<!-- 首先应该有DIV0 这里0是根节点的上级编号,可以设置为自己数据中的相应数据-->
<div id="div0"></div>
------------------------------------------------------------------------------------------------------------------------------
大家可以进一步想,实际点每个内容的时候,一般会链接到某个url,那么,这里怎么处理?
如果你熟悉html和js,当然就是很容易的
思路:数据库中该表增加一个字段,url,定义链接地址
在js中修改代码
----------------------------------------------------------------------------------------------------------------------------------------
大家还可以考虑把它做成标签,更方便
- 纯jsp打造无限层次的树
- struts2+jquery 打造无限层次的树
- 九度无限完全二叉树的层次遍历
- android 打造真正的无限循环viewpager
- Android-->打造无限循环的RecyclerView
- 用dTree打造无限分支树结构
- 纯手工打造即的Jar文件
- 纯CSS打造漂亮的按钮样式
- 纯CSS打造可爱的大白
- 纯css打造漂亮的html表格
- 九度OJ 题目1543:无限完全二叉树的层次遍历
- 九度OJ 1543 无限完全二叉树的层次遍历
- 晒晒我的无限级分类设计--纯数据库实现
- 如何打造一个可以无限注册账号的手机
- 打造纯绿色软件
- 打造DropDownList,TreeView,ListBox无限极分类目录树
- 集合之无限叠加层次
- 纯CSS打造的三级联动级联菜单
- oracle 10g 修改数据库字符集
- 事务处理(Transactions)
- 操作系统嵌入浏览器的创想
- linux服务器开机启动服务
- .NET+AE开发中常见几种非托管对象的释放
- 纯jsp打造无限层次的树
- 快速排序Qsort--C语言版
- 控件.重绘 setredraw
- 获取struct tm中的时间
- codeDom命名空间的使用
- 软件维护常见问题--更换全局变量名称或对象名称
- vc 退出程序语句
- Oracle的备份与恢复
- 翻译: Windows Internals: 第六章: 进程内部结构