bootstrap-table+treegrid实现树形表格


Posted in Javascript onJuly 26, 2019

实现一个树形表格的时候有多种方法:比如把 ztree 的树形直接拼接成表格,或者用强大的 jqgrid 实现,今天介绍一个比较轻量级的实现:使用bootstrap-table + treegrid 。

1、引入 jquery.js、bootstrap-table.js、bootstrap-table-treegrid.js、jquery.treegrid.js 以及相应的 css 文件:bootstrap.css、bootstrap-table.css、jquery.treegrid.css;
2、后台传到前台的 json 必须含有 id、pid字段,有 id pid 才能形成树结构(这里为了演示,把 json 写成固定的了,实际中要从后台获取);
3、在使用过程中可以参考 bootstrap-table 的设置参数,通过不同的设置以达到自己想要的效果;

完整代码示例:

<!DOCTYPE HTML>
<html lang="zh-cn">

<head>
 <meta charset="utf-8" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta content="width=device-width,initial-scale=1.0" name="viewport">
 <meta content="yes" name="apple-mobile-web-app-capable">
 <meta content="black" name="apple-mobile-web-app-status-bar-style">
 <meta content="telephone=no" name="format-detection">
 <meta content="email=no" name="format-detection">
 <title>系统管理</title>
 <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
 <link href="https://cdn.bootcss.com/bootstrap-table/1.11.1/bootstrap-table.min.css" rel="stylesheet">
 <link rel="stylesheet" href=https://cdn.bootcss.com/jquery-treegrid/0.2.0/css/jquery.treegrid.min.css >
</head>

<body>
<div class="container">
 <h1>树形表格 : Table Treegrid</h1>
 <table id="table"></table>
 <br/>
 <button onclick="test()">选择</button>
</div>
</body>
<script src="https://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap-table/1.12.1/bootstrap-table.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap-table/1.12.0/extensions/treegrid/bootstrap-table-treegrid.js"></script>
<script src="https://cdn.bootcss.com/jquery-treegrid/0.2.0/js/jquery.treegrid.min.js"></script>
<script type="text/javascript">
 var $table = $('#table');
 var data = JSON.parse(
 '[{"id":1,"pid":0,"status":1,"name":"用户管理","permissionValue":"open:user:manage"},' +
 '{"id":2,"pid":0,"status":1,"name":"系统管理","permissionValue":"open:system:manage"},' +
 '{"id":3,"pid":1,"status":1,"name":"新增用户","permissionValue":"open:user:add"},' +
 '{"id":4,"pid":1,"status":1,"name":"修改用户","permissionValue":"open:user:edit"},' +
 '{"id":5,"pid":1,"status":0,"name":"删除用户","permissionValue":"open:user:del"},' +
 '{"id":6,"pid":2,"status":1,"name":"系统配置管理","permissionValue":"open:systemconfig:manage"},' +
 '{"id":7,"pid":6,"status":1,"name":"新增配置","permissionValue":"open:systemconfig:add"},' +
 '{"id":8,"pid":6,"status":1,"name":"修改配置","permissionValue":"open:systemconfig:edit"},' +
 '{"id":9,"pid":6,"status":0,"name":"删除配置","permissionValue":"open:systemconfig:del"},' +
 '{"id":10,"pid":2,"status":1,"name":"系统日志管理","permissionValue":"open:log:manage"},' +
 '{"id":11,"pid":10,"status":1,"name":"新增日志","permissionValue":"open:log:add"},' +
 '{"id":12,"pid":10,"status":1,"name":"修改日志","permissionValue":"open:log:edit"},' +
 '{"id":13,"pid":10,"status":0,"name":"删除日志","permissionValue":"open:log:del"}]');

 $(function() {

 //控制台输出一下数据
 console.log(data);

 $table.bootstrapTable({
 data:data,
 idField: 'id',
 dataType:'jsonp',
 columns: [
 { field: 'check', checkbox: true, formatter: function (value, row, index) {
  if (row.check == true) {
  // console.log(row.serverName);
  //设置选中
  return { checked: true };
  }
  }
 },
 { field: 'name', title: '名称' },
 // {field: 'id', title: '编号', sortable: true, align: 'center'},
 // {field: 'pid', title: '所属上级'},
 { field: 'status', title: '状态', sortable: true, align: 'center', formatter: 'statusFormatter' },
 { field: 'permissionValue', title: '权限值' },
 { field: 'operate', title: '操作', align: 'center', events : operateEvents, formatter: 'operateFormatter' },
 ],

 // bootstrap-table-treegrid.js 插件配置 -- start

 //在哪一列展开树形
 treeShowField: 'name',
 //指定父id列
 parentIdField: 'pid',

 onResetView: function(data) {
 //console.log('load');
 $table.treegrid({
  initialState: 'collapsed',// 所有节点都折叠
  // initialState: 'expanded',// 所有节点都展开,默认展开
  treeColumn: 1,
  // expanderExpandedClass: 'glyphicon glyphicon-minus', //图标样式
  // expanderCollapsedClass: 'glyphicon glyphicon-plus',
  onChange: function() {
  $table.bootstrapTable('resetWidth');
  }
 });

 //只展开树形的第一级节点
 $table.treegrid('getRootNodes').treegrid('expand');

 },
 onCheck:function(row){
 var datas = $table.bootstrapTable('getData');
 // 勾选子类
 selectChilds(datas,row,"id","pid",true);

 // 勾选父类
 selectParentChecked(datas,row,"id","pid")

 // 刷新数据
 $table.bootstrapTable('load', datas);
 },

 onUncheck:function(row){
 var datas = $table.bootstrapTable('getData');
 selectChilds(datas,row,"id","pid",false);
 $table.bootstrapTable('load', datas);
 },
 // bootstrap-table-treetreegrid.js 插件配置 -- end
 });
 });

 // 格式化按钮
 function operateFormatter(value, row, index) {
 return [
 '<button type="button" class="RoleOfadd btn-small btn-primary" style="margin-right:15px;"><i class="fa fa-plus" ></i> 新增</button>',
 '<button type="button" class="RoleOfedit btn-small btn-primary" style="margin-right:15px;"><i class="fa fa-pencil-square-o" ></i> 修改</button>',
 '<button type="button" class="RoleOfdelete btn-small btn-primary" style="margin-right:15px;"><i class="fa fa-trash-o" ></i> 删除</button>'
 ].join('');

 }
 // 格式化类型
 function typeFormatter(value, row, index) {
 if (value === 'menu') { return '菜单'; }
 if (value === 'button') { return '按钮'; }
 if (value === 'api') { return '接口'; }
 return '-';
 }
 // 格式化状态
 function statusFormatter(value, row, index) {
 if (value === 1) {
 return '<span class="label label-success">正常</span>';
 } else {
 return '<span class="label label-default">锁定</span>';
 }
 }

 //初始化操作按钮的方法
 window.operateEvents = {
 'click .RoleOfadd': function (e, value, row, index) {
 add(row.id);
 },
 'click .RoleOfdelete': function (e, value, row, index) {
 del(row.id);
 },
 'click .RoleOfedit': function (e, value, row, index) {
 update(row.id);
 }
 };
</script>
<script>
 /**
 * 选中父项时,同时选中子项
 * @param datas 所有的数据
 * @param row 当前数据
 * @param id id 字段名
 * @param pid 父id字段名
 */
 function selectChilds(datas,row,id,pid,checked) {
 for(var i in datas){
 if(datas[i][pid] == row[id]){
 datas[i].check=checked;
 selectChilds(datas,datas[i],id,pid,checked);
 };
 }
 }

 function selectParentChecked(datas,row,id,pid){
 for(var i in datas){
 if(datas[i][id] == row[pid]){
 datas[i].check=true;
 selectParentChecked(datas,datas[i],id,pid);
 };
 }
 }

 function test() {
 var selRows = $table.bootstrapTable("getSelections");
 if(selRows.length == 0){
 alert("请至少选择一行");
 return;
 }

 var postData = "";
 $.each(selRows,function(i) {
 postData += this.id;
 if (i < selRows.length - 1) {
 postData += ", ";
 }
 });
 alert("你选中行的 id 为:"+postData);

 }

 function add(id) {
 alert("add 方法 , id = " + id);
 }
 function del(id) {
 alert("del 方法 , id = " + id);
 }
 function update(id) {
 alert("update 方法 , id = " + id);
 }


</script>
</html>

效果图:

bootstrap-table+treegrid实现树形表格

如果大家还想深入学习,可以点击这里进行学习,再为大家附3个精彩的专题:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
Oct 11 Javascript
JavaScript 验证码的实例代码(附效果图)
Mar 22 Javascript
JS Loading功能的简单实现
Nov 29 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
Jun 23 Javascript
JavaScript判断用户是否对表单进行了修改的方法
Mar 18 Javascript
JS模拟并美化的表单控件完整实例
Aug 19 Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 Javascript
js Dom实现换肤效果
Oct 21 Javascript
使用命令行工具npm新创建一个vue项目的方法
Dec 27 Javascript
AngularJS实现动态切换样式的方法分析
Jun 26 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
May 30 Javascript
详解jQuery的核心函数和事件处理
Feb 18 jQuery
Vue实现商品分类菜单数量提示功能
Jul 26 #Javascript
vue实现滑动切换效果(仅在手机模式下可用)
Jun 29 #Javascript
微信小程序设置滚动条过程详解
Jul 25 #Javascript
vuejs移动端实现div拖拽移动
Jul 25 #Javascript
vue实现拖拽的简单案例 不超出可视区域
Jul 25 #Javascript
vue实现一拉到底的滑动验证
Jul 25 #Javascript
微信小程序实现图片选择并预览功能
Jul 25 #Javascript
You might like
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
PHP实现QQ登录实例代码
2016/01/14 PHP
浅谈php中的循环while、do...while、for、foreach四种循环
2016/11/05 PHP
Yii2框架制作RESTful风格的API快速入门教程
2016/11/08 PHP
PHP常量define和const的区别详解
2019/05/18 PHP
javascript 面向对象思想 附源码
2009/07/07 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
vue+SSM实现验证码功能
2018/12/07 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
mac下如何将python2.7改为python3
2018/07/13 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
python3 反射的四种基本方法解析
2019/08/26 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
如何教少儿学习Python编程
2020/07/10 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
C语言笔试集
2012/07/24 面试题
大客户销售经理职责
2013/12/04 职场文书
环保倡议书怎么写
2014/05/16 职场文书
综合测评个人总结
2015/03/03 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
java设计模式--原型模式详解
2021/07/21 Java/Android