效果:

一、布局:

<div class="three_tree">
<div class="tree_title_cut">
<span>名称</span>
<span>编码</span>
<span>数据域</span>
</div>
<div class="list_group_li click_add_on">
<!-- <div class="list_box two">
<i class="toggleOn arrow_three"></i>
<div class="list one"><span>海南市</span><span>03</span><span>03</span></div>
<div class="two">
<div class="list"><span>市场部</span><span>1</span><span>0301</span></div>
<div class="list"><span>技术部</span><span>2</span><span>0302</span></div>
</div>
</div> -->
</div>
</div>

二、样式:

* {padding:;margin:;box-sizing: border-box;}
.two {display: none;}
.three_tree {
margin: 40px;
border: 1px solid #ccc;
}
.three_tree .tree_title_cut {
width: 100%;
background-color: #e9edf5;
font-size:;
padding: 8px 0;
border-bottom: 1px solid #ccc;
}
.three_tree .tree_title_cut span {
width: 33.33%;
display: inline-block;
text-align: center;
font-size: 14px;
}
.three_tree .tree_title_cut span:first-child{
text-align: left;
padding-left: 10px;
}
.list_group_li .list {
width: 100%;
font-size:;
padding: 5px 0;
}
.list_group_li .list.on {
background-color: rgba(0,0,0,.075);
}
.list_group_li .list:hover {
background-color: rgba(0,0,0,.035);
}
.list_group_li .list.on:hover {
background-color: rgba(0,0,0,.075);
}
.list_group_li .list span {
width: 33.33%;
font-size: 13px;
text-align: center;
display: inline-block;
}
.list_group_li .list span:first-child{
text-align: left;
padding-left: 20px;
}
.list_group_li .two {
margin-left: 15px;
position: relative;
}
.list_group_li >.two {
margin-left:;
display: block;
}
.list_group_li .list_box {
position: relative;
display: block;
margin-left:;
}
.arrow_three {
position: absolute;
left: 10px;
top: 9px;
display: inline-block;
width:0px;
height:0px;
border-top:5px solid transparent;
border-right:5px solid transparent;
border-bottom:5px solid transparent;
border-left:5px solid #666;
cursor: pointer;
transition: 0.1s;
}
.arrow_three.on {
transform: rotate(90deg);
top: 14px;
left: 6px;
transition: 0.1s;
}
.arrow_three:hover {
border-left:5px solid #000;
}

三、看后台返回的数据是什么结构:

看了一下,当children为空时,就是没有下一级。所以可以直接判断children是否为空并循环添加数据。

var data = [
{
"text": "第一级1",
"orgCode": "第一级编码1",
"dataOrg": "01",
"children": [
{
"text": "第二级1",
"orgCode": "第二级编码1",
"dataOrg": "0101",
"children": [
{
"text": "第三级1",
"orgCode": "第三级编码1",
"dataOrg": "010101",
"children": [
{
"text": "第四级1",
"orgCode": "第四级编码1",
"dataOrg": "01010101",
"children": [ ]
},
{
"text": "第四级2",
"orgCode": "第四级编码2",
"dataOrg": "01010102",
"children": [ ]
},
]
},
]
},
{
"text": "第二级2",
"orgCode": "第二级编码2",
"dataOrg": "0102",
"children": [
{
"text": "第二级1",
"orgCode": "第二级编码1",
"dataOrg": "02",
"children": [ ]
}
]
},
]
},
{
"text": "第一级2",
"orgCode": "第一级编码2",
"dataOrg": "02",
"children": [
{
"text": "第二级1",
"orgCode": "第二级编码1",
"dataOrg": "0201",
"children": [ ]
},
]
},
{
"text": "第一级3",
"orgCode": "第一级编码3",
"dataOrg": "03",
"children": [ ]
},
];

四、JS代码:

写一个方法threeTree,第一个参数array是数据,第二个参数html是存放数据的容器,第三个参数show是判断是否默认展示全不列表(不传或者false就只展示第一级内容)。

判断数组children如果不为空,即有下级内容,就执行threeTree方法并传入children的数据,如果一直有children,就一直执行,否则传入没有带三角符的列表。

function threeTree(array,html,show) {
for (var i = 0; i < array.length; i++) {
var object = array[i];
if (object.children != "") {
var e = $('<div class="two"><i class="toggleOn arrow_three"></i></div>');
var f = $('<div class="list"><span>'+object.text+'</span><span>'+object.orgCode+'</span><span>'+object.dataOrg+'</span></div>');
e.append(f);
html.append(e);
threeTree(object.children,e,show);
} else {
html.append('<div class="two"><div class="list"><span>'+object.text+'</span><span>'+object.orgCode+'</span><span>'+object.dataOrg+'</span></div></div>');
}
}
// 是否展示全部
if (show) {
html.find(".two").addClass('show').find(".arrow_three").addClass("on");
}
}
threeTree(data,$(".list_group_li"),false); $(function(){
// 多级树 点击添加类名on
$(document).on('click', '.click_add_on .list', function() {
$(this).parents(".click_add_on").find(".list").removeClass("on");
$(this).addClass("on");
});
// 多级树 toggle
$(document).on('click', '.click_add_on .arrow_three', function() {
if ($(this).hasClass("on")) {
$(this).removeClass("on").siblings(".two").hide();
}else{
$(this).addClass("on").siblings(".two").show();
}
});
});

五、总结:

遇到这种需求,用vue或者angular来处理会方便很多......那我还用js?因为有些人还不会用vue或者angular啊哈哈哈哈!

六、demo代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>多级树</title>
<style type="text/css">
*{padding:0;margin:0;box-sizing:border-box;}
.two{display:none;}
.three_tree{margin:40px;border:1px solid #ccc;}
.three_tree .tree_title_cut{width:100%;background-color:#e9edf5;font-size:0;padding:8px 0;border-bottom:1px solid #ccc;}
.three_tree .tree_title_cut span{width:33.33%;display:inline-block;text-align:center;font-size:14px;}
.three_tree .tree_title_cut span:first-child{text-align:left;padding-left:10px;}
.list_group_li .list{width:100%;font-size:0;padding:5px 0;}
.list_group_li .list.on{background-color:rgba(0,0,0,.075);}
.list_group_li .list:hover{background-color:rgba(0,0,0,.035);}
.list_group_li .list.on:hover{background-color:rgba(0,0,0,.075);}
.list_group_li .list span{width:33.33%;font-size:13px;text-align:center;display:inline-block;}
.list_group_li .list span:first-child{text-align:left;padding-left:20px;}
.list_group_li .two{margin-left:15px;position:relative;}
.list_group_li >.two{margin-left:0;display:block;}
.list_group_li .list_box{position:relative;display:block;margin-left:0;}
.arrow_three{position:absolute;left:10px;top:9px;display:inline-block;width:0px;height:0px;border-top:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #666;cursor:pointer;transition:0.1s;}
.arrow_three.on{transform:rotate(90deg);top:14px;left:6px;transition:0.1s;}
.arrow_three:hover{border-left:5px solid #000;}
</style>
</head>
<body>
<div class="three_tree">
<div class="tree_title_cut">
<span>名称</span>
<span>编码</span>
<span>数据域</span>
</div>
<div class="list_group_li click_add_on">
<!-- <div class="list_box two">
<i class="toggleOn arrow_three"></i>
<div class="list one"><span>海南市</span><span>03</span><span>03</span></div>
<div class="two">
<div class="list"><span>市场部</span><span>1</span><span>0301</span></div>
<div class="list"><span>技术部</span><span>2</span><span>0302</span></div>
</div>
</div> -->
</div>
</div>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script>
var data = [
{
"text": "第一级1",
"orgCode": "第一级编码1",
"dataOrg": "01",
"children": [
{
"text": "第二级1",
"orgCode": "第二级编码1",
"dataOrg": "0101",
"children": [
{
"text": "第三级1",
"orgCode": "第三级编码1",
"dataOrg": "010101",
"children": [
{
"text": "第四级1",
"orgCode": "第四级编码1",
"dataOrg": "01010101",
"children": [ ]
},
{
"text": "第四级2",
"orgCode": "第四级编码2",
"dataOrg": "01010102",
"children": [ ]
},
]
},
]
},
{
"text": "第二级2",
"orgCode": "第二级编码2",
"dataOrg": "0102",
"children": [
{
"text": "第二级1",
"orgCode": "第二级编码1",
"dataOrg": "02",
"children": [ ]
}
]
},
]
},
{
"text": "第一级2",
"orgCode": "第一级编码2",
"dataOrg": "02",
"children": [
{
"text": "第二级1",
"orgCode": "第二级编码1",
"dataOrg": "0201",
"children": [ ]
},
]
},
{
"text": "第一级3",
"orgCode": "第一级编码3",
"dataOrg": "03",
"children": [ ]
},
];
function threeTree(array,html,show) {
for (var i = 0; i < array.length; i++) {
var object = array[i];
if (object.children != "") {
var e = $('<div class="two"><i class="toggleOn arrow_three"></i></div>');
var f = $('<div class="list"><span>'+object.text+'</span><span>'+object.orgCode+'</span><span>'+object.dataOrg+'</span></div>');
e.append(f);
html.append(e);
threeTree(object.children,e,show);
} else {
html.append('<div class="two"><div class="list"><span>'+object.text+'</span><span>'+object.orgCode+'</span><span>'+object.dataOrg+'</span></div></div>');
}
}
// 是否展示全部
if (show) {
html.find(".two").addClass('show').find(".arrow_three").addClass("on");
}
}
threeTree(data,$(".list_group_li"),false);
$(function(){
// 多级树 点击添加类名on
$(document).on('click', '.click_add_on .list', function() {
$(this).parents(".click_add_on").find(".list").removeClass("on");
$(this).addClass("on");
});
// 多级树 toggle
$(document).on('click', '.click_add_on .arrow_three', function() {
if ($(this).hasClass("on")) {
$(this).removeClass("on").siblings(".two").hide();
}else{
$(this).addClass("on").siblings(".two").show();
}
});
});
</script>
</body>
</html>

JS多级树结构写法的更多相关文章

  1. js日期的写法,获取girdviw的行数、提示信息、验证数量信息

    //制订日期(js日期的写法) var myDate = new Date(); var theDate = myDate.toLocaleDateString();  //获取今天的日期 //获取控 ...

  2. Java代码实现封装多级树结构对象

    前言: 在开发中,我们经常见到,前端展示树状结构的,这时候就需要后端去封装一个多级树结构对象,前端根据这样结构的数据去渲染数据,这篇文章讲的是如何封装成多级树结构对象. 正文: 1.先封装个树结构的对 ...

  3. js 多级联动(省、市、区)

      js 多级联动(省.市.区) CreateTime--2018年4月9日17:10:38 Author:Marydon 方式一: 数据从数据库获取,ajax实现局部刷新 方式二: 数据从json文 ...

  4. jq和js用法:入口写法

    jq和js入口写法demo: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  5. js的规范写法ES5(自己以后按照这样写)

    1.引号的使用,单引号' ' 优先(如果不是引号嵌套,不要使用双引号) 正常情况:console.log('hello there')        双引号转码: $("<div cl ...

  6. [JS] 面向对象的5种写法和拓展JS对象的写法

    面向对象的JAVA  最开始当然是对象的定义了 收集了以下的五种写法 //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; C ...

  7. JS对象的写法

    写法1: <script> var database = function () { function add(){ console.info("add"); } fu ...

  8. cocos2d-x for js 继承的写法

    cocos2d-x for js中集成了两套继承写法,一套是JR的(jquery的作者),一套是google. 目前来说,cocos2d-x for js demo使用JR的写法----未完待续... ...

  9. avalon.js 多级下拉框实现

    学习avalon.js的时候,有一个多级下拉框的例子,地址 戳这里 代码实现了联动, 但是逻辑上面理解有点难度,获取选择的值 和 页面初始化 功能存在问题. 在写地图编辑的时候,也用到了多级下拉框,特 ...

随机推荐

  1. Qt 学习之路 2(54):剪贴板

    Qt 学习之路 2(54):剪贴板 豆子 2013年6月8日 Qt 学习之路 2 2条评论 剪贴板的操作经常和前面所说的拖放技术在一起使用.大家对剪贴板都很熟悉.我们可以简单地把它理解成一个数据存储池 ...

  2. POJ2449 Remmarguts' Date A*算法

    题意是让求从st的ed第k短路... 考虑A*算法:先把终点到每个点最短路跑出来(注意要建反图),当做估价函数h(u),然后跑A* 每次取出总代价最小的,即g(u)+h(u)最小的进行扩展,注意如果u ...

  3. wzoi(栈模拟)

    链接:https://ac.nowcoder.com/acm/contest/332/I 来源:牛客网 题目描述 bleaves 最近在 wzoi 上面做题. wzoi 的题目有两种,一种是 noip ...

  4. HihoCoder - 1142 三分法练手

    中文题面,原函数为三峰函数,先折半再三分 #include<bits/stdc++.h> using namespace std; const int maxn = 1e5+11; con ...

  5. UVA - 11404

    题意:求任意删除字符后所形成的最长回文,并输出字典序最小的方案 把原串反转求LIS,因为转移时不断求字典序最小导致后半部分可能并非回文,所以要前半部分输出两边 话说这方案保存可真暴力 #include ...

  6. UVA - 10298 后缀数组(仅观赏)

    题意:求最小循环节 \(KMP\)可以20ms通过,而\(da\)实现的后缀数组并无法在3000ms内通过 听说要用\(dc3\)才勉强卡过,这里仅列出\(da\)实现 #include<ios ...

  7. TimesTen LINUX 安装日志

    $ ./setup.sh NOTE: Each TimesTen installation is identified by a unique instance name. The instance ...

  8. C语言中的输入方式

    在c语言中,有gets().scanf().getchar()等输入方式,但是不同的方式处理的方式不同. scanf()读取时遇见tab.space.enter时会结束读取,不会舍弃最后的回车符(即回 ...

  9. nfs 问题总结

    1. [root@backup read]# touch r01.txt   touch: cannot touch `r01.txt': Stale file handle   使用共享目录创建文件 ...

  10. ListView与ArrayAdapter的搭配使用

    在android中,ListView是一种很重要的控件,一般的使用中,常建立一个所需类型的ArrayList,再通过ArrayAdapter把ListView绑定到ArrayList上,通过Array ...