layui数据表格跨行自动合并的例子


Posted in Javascript onSeptember 02, 2019

需求描述:

在数据表格中,对于按某个分类展示数据其分类下又有多个细分的嵌套细分项,如省市区昵称,省下面有多个市,市下面有多个区,区下面有昵称,需要实现跨行合并,且操作按钮以分类为单位(即操作按钮需按照分类合并)。

需求分析:

除操作列外,以左边列为基础单位进行跨行合并,当前单元格合并数<=左边列;

操作列可以选择任意列作为基础单位(这个待完善)。

原始页面:

layui数据表格跨行自动合并的例子

处理页面:

layui数据表格跨行自动合并的例子

方法:

var execRowspan = function(fieldName,index,flag){
 // 1为不冻结的情况,左侧列为冻结的情况
 let fixedNode = index=="1"?$(".layui-table-body")[index - 1]:(index=="3"?$(".layui-table-fixed-r"):$(".layui-table-fixed-l"));
 // 左侧导航栏不冻结的情况
 let child = $(fixedNode).find("td");
 let childFilterArr = [];
 // 获取data-field属性为fieldName的td
 for(let i = 0; i < child.length; i++){
 if(child[i].getAttribute("data-field") == fieldName){
  childFilterArr.push(child[i]);
 }
 }
 // 获取td的个数和种类
 let childFilterTextObj = {};
 for(let i = 0; i < childFilterArr.length; i++){
 let childText = flag?childFilterArr[i].innerHTML:childFilterArr[i].textContent;
 if(childFilterTextObj[childText] == undefined){
  childFilterTextObj[childText] = 1;
 }else{
  let num = childFilterTextObj[childText];
  childFilterTextObj[childText] = num*1 + 1;
 }
 }
 let canRowspan = true;
 let maxNum;//以前列单元格为基础获取的最大合并数
 let finalNextIndex;//获取其下第一个不合并单元格的index
 let finalNextKey;//获取其下第一个不合并单元格的值
 for(let i = 0; i < childFilterArr.length; i++){
 (maxNum>9000||!maxNum)&&(maxNum = $(childFilterArr[i]).prev().attr("rowspan")&&fieldName!="8"?$(childFilterArr[i]).prev().attr("rowspan"):9999);
 let key = flag?childFilterArr[i].innerHTML:childFilterArr[i].textContent;//获取下一个单元格的值
 let nextIndex = i+1;
 let tdNum = childFilterTextObj[key];
 let curNum = maxNum<tdNum?maxNum:tdNum;
 if(canRowspan){
  for(let j =1;j<=curNum&&(i+j<childFilterArr.length);){//循环获取最终合并数及finalNext的index和key
  finalNextKey = flag?childFilterArr[i+j].innerHTML:childFilterArr[i+j].textContent;
  finalNextIndex = i+j;
  if((key!=finalNextKey&&curNum>1)||maxNum == j){
   canRowspan = true;
   curNum = j;
   break;
  }
  j++;
  if((i+j)==childFilterArr.length){
   finalNextKey=undefined;
   finalNextIndex=i+j;
   break;
  }
  }
  childFilterArr[i].setAttribute("rowspan",curNum);
  if($(childFilterArr[i]).find("div.rowspan").length>0){//设置td内的div.rowspan高度适应合并后的高度
  $(childFilterArr[i]).find("div.rowspan").parent("div.layui-table-cell").addClass("rowspanParent");
  $(childFilterArr[i]).find("div.layui-table-cell")[0].style.height= curNum*38-10 +"px";
  }
  canRowspan = false;
 }else{
  childFilterArr[i].style.display = "none";
 }
 if(--childFilterTextObj[key]==0|--maxNum==0|--curNum==0|(finalNextKey!=undefined&&nextIndex==finalNextIndex)){//||(finalNextKey!=undefined&&key!=finalNextKey)
  canRowspan = true;
 }
 }
}
//合并数据表格行
var layuiRowspan = function(fieldNameTmp,index,flag){
 let fieldName = [];
 if(typeof fieldNameTmp == "string"){
 fieldName.push(fieldNameTmp);
 }else{
 fieldName = fieldName.concat(fieldNameTmp);
 }
 for(let i = 0;i<fieldName.length;i++){
 execRowspan(fieldName[i],index,flag);
 }
}

使用:

HTML:

<div class="box">
<table class="layui-table" id="test" lay-data="{page:true,limit:50}" lay-filter="test">
 <thead>
 <tr>
 <th lay-data="{field:'province', width:200}">省</th>
 <th lay-data="{field:'city', width:200}">市</th>
 <th lay-data="{field:'zone', width:200}">区</th>
 <th lay-data="{field:'username', width:200}">昵称</th>
 <th lay-data="{field:'joinTime', width:150}">加入时间</th>
 <th lay-data="{field:'sign', minWidth: 180}">签名</th>
 <th lay-data="{field:'8',align:'right'}">基本操作</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>浙江</td>
 <td>杭州</td>
 <td>西湖区</td>
 <td>贤心1</td>
 <td>2016-11-28</td>
 <td>人生就像是一场修行 A</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>浙江</td>
 <td>这个</td>
 <td>西湖区</td>
 <td>贤心2</td>
 <td>2016-11-29</td>
 <td>人生就像是一场修行 B</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>浙江</td>
 <td>丽水</td>
 <td>莲都区</td>
 <td>贤心3</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>浙江</td>
 <td>丽水</td>
 <td>莲都区</td>
 <td>贤心3</td>
 <td>2016-19-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>浙江</td>
 <td>位置</td>
 <td>莲都区</td>
 <td>贤心3</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>位置</td>
 <td>莲都区</td>
 <td>贤心3</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>这个</td>
 <td>1区</td>
 <td>贤心3</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>这个</td>
 <td>1区</td>
 <td>贤心3</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>这个</td>
 <td>1区</td>
 <td>贤心3</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 B</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>这个</td>
 <td>1区</td>
 <td>贤心</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 B</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>这个</td>
 <td>1区</td>
 <td>贤心</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 C</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 <tr>
 <td>湖北</td>
 <td>这个</td>
 <td>1区</td>
 <td>贤心</td>
 <td>2016-11-30</td>
 <td>人生就像是一场修行 D</td>
 <td>
  <div class="layui-btn-group" style="overflow:visible;">
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="detail">按钮1</a>
  <a class="layui-btn layui-btn-primary layui-btn-xs" lay-event="edit">按钮2</a>
  </div>
 </td>
 </tr>
 </tbody>
</table>
 </div>
layui.use('table', function(){
  var table = layui.table;
  table.init('test',{done:function(res,curr,count){
   layuiRowspan('province',1);
   layuiRowspan(['city','zone','username','joinTime','sign'],1);//支持数组
   layuiRowspan("8",1,true);
  }
  });})

以上这篇layui数据表格跨行自动合并的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 权威指南(第四版) 读书笔记
Aug 11 Javascript
High Performance JavaScript(高性能JavaScript)读书笔记分析
May 05 Javascript
js 触发select onchange事件代码
Mar 20 Javascript
JsRender for object语法简介
Oct 31 Javascript
JavaScript实现仿网易通行证表单验证
May 25 Javascript
概述jQuery的元素筛选
Nov 23 Javascript
Node.js连接MongoDB数据库产生的问题
Feb 08 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
详解Node.js模板引擎Jade入门
Jan 19 Javascript
vue.js input框之间赋值方法
Aug 24 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
May 10 Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 Javascript
Vue form表单动态添加组件实战案例
Sep 02 #Javascript
小程序和web画三角形实现解析
Sep 02 #Javascript
vue-cli随机生成port源码的方法
Sep 02 #Javascript
微信小程序 云开发模糊查询实现解析
Sep 02 #Javascript
layui 数据表格 点击分页按钮 监听事件的实例
Sep 02 #Javascript
js中比较两个对象是否相同的方法示例
Sep 02 #Javascript
浅谈vue限制文本框输入数字的正确姿势
Sep 02 #Javascript
You might like
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
jquery $.getJSON()跨域请求
2011/12/21 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
Jquery取得iframe下内容的方法
2013/11/18 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
VSCode 添加自定义注释的方法(附带红色警戒经典注释风格)
2020/08/27 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
深入解析Python编程中JSON模块的使用
2015/10/15 Python
python getopt详解及简单实例
2016/12/30 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python list和str互转的实现示例
2020/11/16 Python
HTML5实现获取地理位置信息并定位功能
2015/04/25 HTML / CSS
会计电算化应届生求职信
2013/11/03 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
餐厅服务员岗位职责
2015/02/09 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
撤诉状格式范本
2015/05/19 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
90行Python代码开发个人云盘应用
2021/04/20 Python
go类型转换及与C的类型转换方式
2021/05/05 Golang
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server