纯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中修改代码

----------------------------------------------------------------------------------------------------------------------------------------

大家还可以考虑把它做成标签,更方便

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机进水听音乐人声小怎么办 华为荣耀v8手机音量小怎么办 手机充电孔松了怎么办 华为荣耀7卡顿怎么办 华为手机话筒没声音怎么办 苹果x耳机进水了怎么办 苹果6p进水了怎么办 华为手机声音变耳机模式怎么办 手机设置成耳机模式怎么办 opop耳机一个没有声音怎么办 oppo手机上显示耳机模式怎么办 微信显示耳机模式怎么办 微信变成耳机模式怎么办 5s变成耳机模式怎么办 华为手机一直是耳机模式怎么办 华为手机进水了耳机模式怎么办 蓝牙耳机通话声音小怎么办 华为手机自动进入耳机模式怎么办 华为手机耳机怎么挂了电话怎么办 华为手机听筒声音小怎么办 华为p9手机听筒声音小怎么办 苹果6总是耳机模式怎么办 苹果没有插耳机模式怎么办 苹果手机切换耳机模式怎么办 苹果6s出现耳机模式怎么办 苹果6变成了耳机模式怎么办 苹果手机成耳机模式了怎么办 华为mate8耳机声音小怎么办 移动sim卡丢了怎么办 蓝牙耳机开不开机怎么办 苹果手机蓝牙不匹配怎么办 苹果6蓝牙坏了怎么办 蓝牙密钥不正确不匹配怎么办 华为p6开不了机怎么办 华为c199手机不停重启怎么办 华为手机用户数据被锁定怎么办 朵唯手机丢了怎么办 网件r6220穿墙差怎么办 无线网打王者卡怎么办 酷翼x9忘了密码怎么办 楼上的路由器楼下不好使怎么办