Layui之表格单元格合并

前言

layui是一个不错的后台UI框架,最近一直在学习。但是它原来的表格不支持单元格合并。比如项目这一列,有相同的行,我们就需要合并一下。

就像是这样:

一、实现

我们需要在表格实例化之后再对其样式进行修改,因此我们需要写个函数,在表格render后的done函数里调用。

/**
 *  name layuiRowspan
 * @param fieldName  要合并列的field属性值
 * @param index 要合并列的索引值 从1开始(如果要合并第一列,则index = 1;) 
 * @desc 此方法适用于合并列冻结的单元格
 */
function layuiRowspan(fieldName,index){
	// 左侧列为冻结的情况
	var tbodyNode = document.getElementsByClassName("layui-table-fixed-l")[index-1];
	var child = tbodyNode.getElementsByTagName("td");
	var childFilterArr = [];
	// 获取data-field属性为fieldName的td
	for(var i = 0; i < child.length; i++){
		if(child[i].getAttribute("data-field") == fieldName){
			childFilterArr.push(child[i]);
		}
	}
	// 获取td的个数和种类
	var childFilterTextObj = {};
	for(var i = 0; i < childFilterArr.length; i++){
		var childText = childFilterArr[i].textContent;
		if(childFilterTextObj[childText] == undefined){
			childFilterTextObj[childText] = 1;
		}else{
			var num = childFilterTextObj[childText];
			childFilterTextObj[childText] = num*1 + 1;
		}
	}
	// 给获取到的td设置合并单元格属性
	for(var key in childFilterTextObj){
		var tdNum = childFilterTextObj[key];
		var canRowspan = true;
		for(var i = 0; i < childFilterArr.length; i++){
			if(childFilterArr[i].getAttribute("data-content") == key){
				if(canRowspan){
					childFilterArr[i].setAttribute("rowspan",tdNum);
					canRowspan = false;
				}else{
					childFilterArr[i].style.display = "none";
				}
			}
		}
	}
}
/**
 * name layui合并tbody中单元格的方法
 * @param fieldName  要合并列的field属性值
 * @param index 表格的索引值 从1开始
 * @desc 此方式适用于没有列冻结的单元格合并
 */
function alarmTableRowSpan(fieldName, index) {
	var fixedNode = document.getElementsByClassName("layui-table-body")[index - 1];
	if (!fixedNode) {
		return false;
	}
	var child = fixedNode.getElementsByTagName("td");
	var childFilterArr = [];
	// 获取data-field属性为fieldName的td
	for (var i = 0; i < child.length; i++) {
		if (child[i].getAttribute("data-field") == fieldName) {
			childFilterArr.push(child[i]);
		}
	}
	// 获取td的个数和种类
	var childFilterTextObj = {};
	for (var i = 0; i < childFilterArr.length; i++) {
		var childText = childFilterArr[i].textContent;
		if (childFilterTextObj[childText] == undefined) {
			childFilterTextObj[childText] = 1;
		} else {
			var num = childFilterTextObj[childText];
			childFilterTextObj[childText] = num * 1 + 1;
		}
	}
	// 给获取到的td设置合并单元格属性
	for (var key in childFilterTextObj) {
		var tdNum = childFilterTextObj[key];
		var canRowSpan = true;
		for (var i = 0; i < childFilterArr.length; i++) {
			if (childFilterArr[i].textContent == key) {
				if (canRowSpan) {
					childFilterArr[i].setAttribute("rowspan", tdNum);
					canRowSpan = false;
				} else {
					childFilterArr[i].style.display = "none";
				}
			}
		}
	}
}

接下来就是在done里调用就可以了。

写在最后的话

一直在学习

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
layui table是一款基于layui框架的数据表格插件,可以实现表格分页、排序、过滤等功能,而且还支持合并单元格合并单元格主要是指在表格合并相邻的单元格,将它们合并成一个单元格,从而可以显示更加复杂的数据。 在layui table中,合并单元格有两种方式实现: 第一种方式是通过设置colspan和rowspan属性来合并单元格。具体使用方法如下: table.render({ elem: '#test', cols: [[ //表头 {field: 'id', title: 'ID', width: 80}, {field: 'username', title: '用户名', width: 120}, {field: 'sex', title: '性别', width: 80}, {field: 'city', title: '城市', width: 100}, {field: 'sign', title: '签名', width: 200}, {field: 'experience', title: '积分', width: 100}, {field: 'score', title: '评分', width: 100}, {field: 'classify', title: '职业', width: 100}, {field: 'wealth', title: '财富', width: 100} ]], data: [], done: function(res, curr, count){ //合并单元格 var index = 0; var data = res.data; for(var i=0;i<data.length;i++){ layui.$('#test tr:eq('+index+') td:eq(0)').attr('rowspan', 2); layui.$('#test tr:eq('+index+') td:eq(1)').attr('rowspan', 2); layui.$('#test tr:eq('+index+') td:eq(2)').attr('rowspan', 2); index += 2; } } }); 第二种方式是通过设置lay-id属性来合并单元格。具体使用方法如下: table.render({ elem: '#test', url: '/demo/table/user/', method: 'get', cols: [[ {field:'id', title:'ID', width:80, sort:true, fixed: 'left'} ,{field:'username', title:'用户名', width:120} ,{field:'sex', title:'性别', width:80, sort:true} ,{field:'city', title:'城市', width:100} ,{field:'sign', title:'签名', width:200} ,{field:'experience', title:'积分', width:100, sort:true} ,{field:'score', title:'评分', width:100, sort:true} ,{field:'classify', title:'职业', width:100} ,{field:'wealth', title:'财富', width:135, sort:true, fixed: 'right'} ]], id: 'test', page: true, limit: 10, height: 'full-200', done:function(res, curr, count){ //合并单元格 var data = res.data; var mergeList = ['username','city','classify']; for(var i=0;i<mergeList.length;i++){ var mergeArray = []; var mergeCount = 1; for(var j=0;j<data.length;j++){ if(j==data.length-1){ mergeArray.push(mergeCount); }else{ if(data[j][mergeList[i]]==data[j+1][mergeList[i]]){ mergeCount++; }else{ mergeArray.push(mergeCount); mergeCount = 1; } } } var id = '#' + layui.table.config.id; layui.$(id + ' tbody tr').each(function(rowIndex){ var td = layui.$(this).find('td[data-field='+mergeList[i]+']'); for(var k = 0;k<td.length;k++){ if(mergeArray[rowIndex] && mergeArray[rowIndex]>1){ layui.$(td[k]).attr('rowspan', mergeArray[rowIndex]); mergeArray[rowIndex]--; } } }) } } }); 以上是两种实现layui table合并单元格的方法,具体根据实际需求而定。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值