Bootstrap table 实现树形表格联动选中联动取消功能


Posted in Javascript onSeptember 30, 2019

公司最近有需求要做树形式table。因为是前后端不分离项目,且之前已经引入了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="external nofollow" rel="stylesheet">
 <link href="https://cdn.bootcss.com/bootstrap-table/1.11.1/bootstrap-table.min.css" rel="external nofollow" rel="stylesheet">
 <link rel="stylesheet" href="https://cdn.bootcss.com/jquery-treegrid/0.2.0/css/jquery.treegrid.min.css" rel="external nofollow" >
</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 = [{0: undefined, id: 94710, pid: 0, mode: "系统管理", permissionTag: "*", permissionMark: "所有权限", }
,{0: undefined, id: 94711, pid: 94710, mode: "营销中心管理", permissionTag: "*", permissionMark: "所有权限",}
,{0: undefined, id: 471104, pid: 94711, mode: "营销中心管理", permissionTag: "search", permissionMark: "查询",}
,{0: undefined, id: 94721, pid: 94710, mode: "工厂管理", permissionTag: "*", permissionMark: "所有权限", }
,{0: undefined, id: 472104, pid: 94721, mode: "工厂管理", permissionTag: "search", permissionMark: "查询", }
,{0: undefined, id: 94731, pid: 94710, mode: "经销商管理", permissionTag: "*", permissionMark: "所有权限", }
,{0: undefined, id: 473104, pid: 94731, mode: "经销商管理", permissionTag: "search", permissionMark: "查询", }
,{0: undefined, id: 94732, pid: 94710, mode: "产品管理", permissionTag: "*", permissionMark: "所有权限", }
,{0: undefined, id: 473201, pid: 94732, mode: "产品管理", permissionTag: "insert", permissionMark: "添加", }
,{0: undefined, id: 473202, pid: 94732, mode: "产品管理", permissionTag: "update", permissionMark: "修改", }
, {0: undefined, id: 473203, pid: 94732, mode: "产品管理", permissionTag: "delete", permissionMark: "删除", }
, {0: undefined, id: 473204, pid: 94732, mode: "产品管理", permissionTag: "search", permissionMark: "查询", }
, {0: undefined, id: 94741, pid: 94710, mode: "用户账号", permissionTag: "*", permissionMark: "所有权限", }
, {0: undefined, id: 474101, pid: 94741, mode: "用户账号", permissionTag: "insert", permissionMark: "添加", }
, {0: undefined, id: 474102, pid: 94741, mode: "用户账号", permissionTag: "update", permissionMark: "修改", }
, {0: undefined, id: 474103, pid: 94741, mode: "用户账号", permissionTag: "delete", permissionMark: "删除", }
, {0: undefined, id: 474104, pid: 94741, mode: "用户账号", permissionTag: "search", permissionMark: "查询", }
, {0: undefined, id: 474105, pid: 94741, mode: "用户账号", permissionTag: "resetPwd", permissionMark: "重置密码", }
, {0: undefined, id: 94742, pid: 94710, mode: "角色权限管理", permissionTag: "*", permissionMark: "所有权限", }
, {0: undefined, id: 474201, pid: 94742, mode: "角色权限管理", permissionTag: "insert", permissionMark: "添加", }
, {0: undefined, id: 474202, pid: 94742, mode: "角色权限管理", permissionTag: "update", permissionMark: "修改", }
, {0: undefined, id: 474203, pid: 94742, mode: "角色权限管理", permissionTag: "delete", permissionMark: "删除", }
, {0: undefined, id: 474204, pid: 94742, mode: "角色权限管理", permissionTag: "search", permissionMark: "查询", }
, {0: undefined, id: 94760, pid: 0, mode: "运营中心", permissionTag: "*", permissionMark: "所有权限", }
, {0: undefined, id: 94770, pid: 94760, mode: "跨区域调拨单", permissionTag: "*", permissionMark: "所有权限", }
, {0: undefined, id: 476104, pid: 94770, mode: "跨区域调拨单", permissionTag: "search", permissionMark: "查询", }
, {0: undefined, id: 476105, pid: 94770, mode: "跨区域调拨单", permissionTag: "download", permissionMark: "下载", }]

 $(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: 'mode', title: '名称' },
    { field: 'permissionTag', title: '状态', },
    { field: 'permissionMark', title: '权限值' },
   ],
   // bootstrap-table-treegrid.js 插件配置 -- start
   //在哪一列展开树形
   treeShowField: 'mode',
   //指定父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){
    event.preventDefault()
    var datas = $table.bootstrapTable('getData');
    console.log(datas)
    row.check = true
    // 勾选子类
    selectChilds(datas,row,"id","pid",true);
    // 勾选父类
    selectParentChecked(datas,row,"id","pid")

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

   onUncheck:function(row){
    event.preventDefault()
    row.check = false
    var datas = $table.bootstrapTable('getData');
    selectChilds(datas,row,"id","pid",false);
    //取消选中最后一个子元素时时查找对应父元素取消
    selectParentUnchecked(datas,row,"id","pid")
    $table.bootstrapTable('load', datas);
   },
   // bootstrap-table-treetreegrid.js 插件配置 -- end
  });
 });

 
</script>
<script>
 /**
  * 选中父项时,同时选中子项
  * @param datas 所有的数据
  * @param row 当前数据
  * @param id id 字段名
  * @param pid 父id字段名
  */
 function selectChilds(datas,row,id,pid,checked) {
  console.log("zi",datas,'row',row,'check',checked)
  for(var i in datas){
   if(datas[i][pid] == row[id]){
    datas[i].check=checked;
    selectChilds(datas,datas[i],id,pid,checked);
   };
  }
 }

 function selectParentUnchecked(datas,row,id,pid){
  console.log("fu--Uncheck",datas,'row',row,)
  let key = 0;
  for(var i in datas){
  if(datas[i].pid == row.pid && datas[i].check == true){
   key++
  }
  }
  console.log(key)
  if(key == 0 ){
  for(var i in datas){
   if(datas[i][id] == row[pid]){
   datas[i].check=false;
   selectParentUnchecked(datas,datas[i],id,pid);
   }
  }
  }
 }

 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);
 }
</script>
</html>

实现的效果图为:

Bootstrap table 实现树形表格联动选中联动取消功能

总结

以上所述是小编给大家介绍的Bootstrap table 实现树形表格联动选中联动取消功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript 面向对象全新理练之原型继承
Dec 03 Javascript
jQuery中jqGrid分页实现代码
Nov 04 Javascript
javascript中input中readonly和disabled区别介绍
Oct 23 Javascript
jquery选择器之属性过滤选择器详解
Jan 27 Javascript
js的回调函数详解
Jan 05 Javascript
JavaScript模板引擎用法实例
Jul 10 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
浅析JavaScript 调试方法和技巧
Oct 22 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
Dec 27 Javascript
Angular中$state.go页面跳转并传递参数的方法
May 09 Javascript
javascript 判断用户有没有操作页面
Oct 17 Javascript
vue treeselect获取当前选中项的label实例
Aug 31 Javascript
bootstrap table实现iview固定列的效果实例代码详解
Sep 30 #Javascript
JavaScript实现图片上传并预览并提交ajax
Sep 30 #Javascript
浅探express路由和中间件的实现
Sep 30 #Javascript
JavaScript实现单图片上传并预览功能
Sep 30 #Javascript
解决vue cli使用typescript后打包巨慢的问题
Sep 30 #Javascript
laravel实现中文和英语互相切换的例子
Sep 30 #Javascript
JavaScript键盘事件响应顺序详解
Sep 30 #Javascript
You might like
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
使用php检测用户当前使用的浏览器是否为IE浏览器
2013/12/03 PHP
表单内同名元素的控制
2006/11/22 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
jQuery使用$.ajax进行异步刷新的方法(附demo下载)
2015/12/04 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
Javascript中toFixed计算错误(依赖银行家舍入法的缺陷)解决方法
2017/08/22 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
美国保健品专家:Life Extension
2018/05/04 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
应届毕业生的自我鉴定
2013/11/13 职场文书
大学生校园创业计划书
2014/02/08 职场文书
大学新闻系自荐书
2014/05/31 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
2014年民警工作总结
2014/11/25 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技