效果:

一、布局:

<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. upsource代码审查

    upsource 从零搭建代码审查平台,需要的不仅是把代码审查的工具搭起来,还要结合公司情况制定一系列的代码审查规范.下面是对选择的upsource web端代码审查工具的安装及介绍.详细的请看这篇文 ...

  2. springcloud微服务总结 zuul

    一 springcloud网关组件理解: 为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先 ...

  3. flask_restful

    from flask_restful import (Resource, reqparse) # 参数解析对象生成 parser = reqparse.RequestParser() parser.a ...

  4. DP小小结

    入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串 [AHOI2009]中国象棋 , 详见代码 [HNOI2007]梦幻岛宝珠 , 详见代码 [NOIP2012]开车旅行 , 没 ...

  5. plsql11破解注册码

    plsql11.0.6.1796-64bit的可以用注册码: Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqz serial Number: passwo ...

  6. 【记录】SQL注入过滤源码分享

    $id=check_addslashes($_GET['id']);$id= preg_replace('/o*r/i',"", $id); //strip out OR (non ...

  7. Trie - 20181113

    442. Implement Trie (Prefix Tree) class TrieNode { public boolean isWord; public TrieNode[] children ...

  8. BankNote

    # coding=utf-8 import pandas as pd import numpy as np from sklearn import cross_validation import te ...

  9. 使用kafka bin目录中的zookeeper-shell.sh来查看kafka在zookeeper中的配置

    cd kafka_2.11-0.10.2.1\bin\windowsecho ls /brokers/ids |  zookeeper-shell.bat localhost:2181 使用kafka ...

  10. 踩坑--http返回码之302状态码

    项目介绍:springboot+shiro+maven 业务需求:拦截一切不登录的盗链URL,除了问卷调查,可以给任意用户填写和提交意外. 问题重现:表单提交过程中返回302状态码,我就觉得很奇怪.在 ...