效果:

一、布局:

<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. django bug 与陷阱

    环境:ubuntu,python3.4 1.QueryDict 陷阱 :以下语句语句是取每行的头元素,其中line应该是一个列表.问题是,line在实际运行中已经不是列表,而变成了列表中的头元素. 错 ...

  2. hdu 6196 搜索+剪枝

    Today, Bob plays with a child. There is a row of n numbers. One can takes a number from the left sid ...

  3. 实现bootstrap的dropdown-menu(下拉菜单)点击后不关闭的方法 (转)

    实现bootstrap的dropdown-menu(下拉菜单)点击后不关闭的方法 问题描述,在下拉菜单中,添加其他元素,例如,原文作者所述的<a>和我自己实际用到的<input> ...

  4. pkg-config 切换opencv版本

    查看当前版本 pkg-config --modversion opencv 在~/.bashrc最后添加如下内容: CMAKE_INSTALL_PREFIX=/usr/local/opencv3 ex ...

  5. 洛谷 P3381【模板】最小费用最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表 ...

  6. 关于NPOIExcel导出excel

    1.支持导出多个sheet文件 /// <summary> /// 导出到Excel并下载(html) /// </summary> /// <param name=&q ...

  7. CodeForces - 1110C-Meaningless Operation(打表找规律)

    Can the greatest common divisor and bitwise operations have anything in common? It is time to answer ...

  8. [转] log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

    [From] http://www.tuicool.com/articles/INveIf 注:下文中的“桥接”.“转调”.“绑定”等词基本都是同一个概念. log4j-over-slf4j和slf4 ...

  9. 【总结】sqlmap命令

    post -u url --forms --skip(指定跳过参数) "" --technique BEUST(自选) --dbms mysql --batch --threads ...

  10. Heap — 20181120

    363. Trapping Rain Water public class Solution { /** * @param heights: a list of integers * @return: ...