纯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的就可以了
找到这些下级,就设置其隐藏或显示即可
建表
use tempdb
go
create table tb
(
id int primary key,
name varchar(50) not null,
super int references tb
)
insert into tb values (1,'总公司',null);
insert into tb values (2,'长沙分公司',1);
insert into tb values (3,'株洲分公司',1);
insert into tb values (4,'湘潭公司',1);
insert into tb values (5,'长沙东区分点',2);
insert into tb values (6,'长沙南区分点',2);
insert into tb values (7,'湘潭东区分点',4);
insert into tb values (8,'长沙东区分点一处',5);
insert into tb values (9,'长沙东区分点二处',5);
insert into tb values (10,'长沙东区分点三处',5);
insert into tb values (11,'长沙南区分点一处',6);
insert into tb values (12,'长沙南区分点二处',6);
insert into tb values (13,'湘潭东区分点一处',7);
insert into tb values (14,'湘潭东区分点二处',7);
insert into tb values (15,'长沙东区分点一处一门市部',8);
insert into tb values (16,'长沙东区分点一处二门市部',8);
select id,name,isnull(super,0) as super from tb order by super
-------------------------------------------------------------------------------------------------------------------------
tree.jsp文件
<%@ page language="java" import="java.sql.*,java.util.*" pageEncoding="gbk" contentType="text/html; charset=gbk" isELIgnored="false"%>
<%
//获取数据库的数据,并保存为双层集合,然后放到pageContext中
//这样与使用dao和servlet得到的,放到request中的方式是一致的
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
String url = "jdbc:microsoft:sqlserver://localhost:1433;databasename=tempdb";
Connection cn = DriverManager.getConnection(url,"sa","sa");
Statement st = cn.createStatement();
String sql = "select id,name,isnull(super,0) as super from tb order by super";
ResultSet rs = st.executeQuery(sql);
ArrayList lstAll = new ArrayList();
ArrayList lstLine;
while(rs.next()) {
lstLine = new ArrayList();
lstLine.add(rs.getString(1));
lstLine.add(rs.getString(2));
lstLine.add(rs.getString(3));
lstAll.add(lstLine);
}
pageContext.setAttribute("lstAll",lstAll);
%>
<script>
//初始化树
function ini() {
var str = "${lstAll}";
var ary = str.split("], [");
var i,j;
var len = ary.length;
var ary2,len2;
var str,str2,obj;
for(i=0;i<len;i++) {
ary[i] = ary[i].replace("[[","");
ary[i] = ary[i].replace("]]","");
ary2 = ary[i].split(", ");
if(ary2[2]=="0") {
//顶层:设置其上级为div0
obj = document.getElementById("div0");
//定义自身内容,设置自身可见 -- display:block
//span用于确定 + 或 - ,并且ope函数用于点击时显示或隐藏下级
str2 = "<div style='display:block' id='div" + ary2[0] + "'><span id='span" + ary2[0] + "' onclick='ope(" + ary2[0] + ")'>+</span>  " + ary2[1] + "</div>";
}
else {
//其他:查找其上级,即:ID为 'div' + ary2[2] 的div
//如:如果ary2[2]为3,那么其上级为 div3
obj = document.getElementById("div" + ary2[2]);
//定义自身内容,其中title用于存储其上级ID,设置自身不可见 -- display:none
str2 = "<div style='display:none' id='div" + ary2[0] + "' title='" + ary2[2] + "'><span id='span" + ary2[0] + "' onclick='ope(" + ary2[0] + ")'>+</span>  " + ary2[1] + "</div>";
}
str = obj.innerHTML; //获取上级原来的内容
str = str + str2; //附加当前div
obj.innerHTML = str; //设置上级的新内容
}
}
//点某个节点时,展开或隐藏其下级
function ope(id) {
//首先改变 + 和 -
var obj = document.getElementById("span" + id);
if(obj.innerHTML == "+") {
obj.innerHTML = "-";
}
else {
obj.innerHTML = "+";
}
//然后找到下级,并改变其可见性
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();">
<div id="div0"></div>
------------------------------------------------------------------------------------------------------------------------------
大家可以进一步想,实际点每个内容的时候,一般会链接到某个url,那么,这里怎么处理?
如果你熟悉html和js,当然就是很容易的
思路:数据库中该表增加一个字段,url,定义链接地址
在js中修改代码
大家还可以考虑把它做成标签,更方便

(0)

相关推荐

  • 纯jsp打造无限层次的树代码

    做树并不复杂,但我们通常做的是2层或3层,那样的数据一般来自多个表,比如:部门,员工 然而这种自连接的表,其没有确定的层次,可能是无限多级 比如:a是b的上级,b是c的上级,c是d的上级... 每个上级有几个下级,下级的层次,都是动态的 解决这个问题,其实主要用到js的知识 可以使用div的innerHTML属性 当然也可以用table,用append的方法 下面就用div的innerHTML属性来实现 主要思路是通过super,在document中查找id与自身super关联的div,这个di

  • struts2 jquery 打造无限层次的树

    <%-- tree.jsp --%> <%@ page pageEncoding="gbk" contentType="text/html;charset=gbk" import="java.util.ArrayList" %> <%@ taglib uri="/struts-tags" prefix="s" %> <link rel="styleshee

  • 纯php打造的tab选项卡效果代码(不用js)

    1.根据get判断,获取get生成css 复制代码 代码如下: <style type="text/css"> <?php if(!isset($_GET['city_id'])) { $city_id = 12; } else { $city_id = $_GET['city_id']; } echo '.a'.$city_id.' { color:red; } '; for($i=12;$i<=16;$i++) { if($i != $city_id) {

  • 纯jsp实现的倒计时动态显示效果完整代码

    本文实例讲述了纯jsp实现的倒计时动态显示效果代码.分享给大家供大家参考,具体如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <div id="showTimes"></div> <% long current_time=System.currentTimeMillis(); long e

  • swiper 自动图片无限轮播实现代码

    完整代码 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="swiper/css/swiper-3.4.2.min.css" rel="external nof

  • C#无限栏目分级程序代码分享 好东西第1/3页

    数据库表的结构必须有以下字段:  screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.ope

  • asp.net实现DropDownList,TreeView,ListBox的无限极分类目录树

    本文实例讲述了asp.net实现DropDownList,TreeView,ListBox的无限极分类目录树.分享给大家供大家参考,具体如下: #region DropDownList无限递归显示层次关系 /// <summary> /// 创建无限分级下拉列表框 /// </summary> /// <param name="ddlst">下拉控件</param> /// <param name="dt">

  • C#调用和实现WebService,纯手工打造!

    先为啥要纯手工打造呢,因为对方是用C++做的,我按照他们给出的WSDL实现了一个WebService,结果他们完全不能调用.具体是他们调用的问题还是WSDL定义的问题,不可考了. 悲催的弱势方--只能我们去配合他们.不提了. 首先用C#调用对方的WebService.因为对方用的C++实现,添加Web服务引用方式无效--直接添加WSDL的调用对方不认-- 只好手工打造,还好C#足够强大. HttpWebRequest类可以简单的实现WebService调用. 首先手工打造SOAP包内容 复制代码

  • 创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类信息(id:该分类的ID值,cate_name:该分类的名称,pid:父ID,sorts:为显示标题顺序排序做准备,可不写.) public function cate_display() { $cate = D('Cate'); $field = array('id','cate_name','p

  • jQuery zTree搜索-关键字查询 递归无限层功能实现代码

     唠叨一哈 前两天朋友跟我说要一个ztree的搜索功能,我劈头就是一巴掌:这种方法难道无数前辈还做少了?自己去找,我很忙~然后我默默地蹲着写zTree的搜索方法去了.为什么呢?因为我说了句"找不到是不可能的啊,肯定有很多人早做了无数了,找不到我给你写还请你恰午饭",然而我也去找了很久也没有找到(泪崩,我的计划,我的午饭~).绝大多数都是用的API里面的getNodesByParamFuzzy()或者高亮之类的.然而朋友表示需求不符合:1. 匹配失败父节点也隐藏:2.能自定义匹配规则,即

随机推荐