純jsp打造無限層次的樹代碼

來源:互聯網
上載者:User

做樹並不複雜,但我們通常做的是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中修改代碼
大家還可以考慮把它做成標籤,更方便
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.