JavaScript JS合并单元格 rowspan

功能模块用到了合并单元格,网上看了下大都是转来转去的,而且多列合并时,没有判断前面的列是否存在合并, 造成后续列合并与前列有冲突,于是花时间写了一个

判断依据是取需要判断的第一行数据,循环剩下的数据行和第一行值匹配,条件满足则为合并单元格,遇到不等的开始新循环判断

function test(mTab, colIndex, beginRow,isCk) {
	//前列验证
	var chkCS=function(tab,rindex,cindex){
		var row=mTab.rows[rindex];
		var sr=-1,isrowspan='';
		for(var r=cindex-1;r>=0;r--){
			sr=row.cells[r]?row.cells[r].getAttribute('abbr'):0;
			isrowspan=row.cells[r]?row.cells[r].getAttribute('isrowspan'):'n';
			if(sr||isrowspan=='y')
				break;
		}
		return sr===null?0:sr;
	}
	if (mTab != null) {
		//单元格			
		var tdb = mTab.rows[beginRow].cells[colIndex];
		//单元格文本
		var tdTxt=tdb.innerText;
		var nexttxt = '',//下一行文本
		currenttd,//当前循环单元格
		lastColspan,//前列合并序号
		colspan = 1;//合并个数
		for (var i = beginRow + 1; i < mTab.rows.length; i++) {
			currenttd=mTab.rows[i].cells[colIndex];
			if(!currenttd)
				continue;
			nexttxt =currenttd.innerText;
			//之前有合并的不能超出上一合并行值,当isCk传入true时不进行前列判断,完全合并
			lastColspan=isCk?-1:chkCS(mTab,i,colIndex);
			//添加属性确定当前列为合并列,后续判断使用
			currenttd.setAttribute('isrowspan','y');
			//判断是否需要合并,合并隐藏。并且合并数量不得超过前一合并值
			if (tdTxt == nexttxt&&(lastColspan>colspan||lastColspan==-1)) {
				//console.log('合并第'+colIndex+'列'+'行:'+i+',abbr:'+lastColspan);
				colspan++;
				currenttd.setAttribute('abbr',colspan);
				currenttd.style.display = "none";
			} else {
				//当值不等,或者不满足条件,合并,开始新循环
				tdb.rowSpan = colspan;
				tdb = currenttd;
				tdTxt = nexttxt;
				colspan = 1;
			}
			//最后一行合并下
			if(i==mTab.rows.length-1){
				tdb.rowSpan = colspan;
			}
		}
	}		
}
测试不多,可能会在合并bug

合并前,最后一列是忽略前边列的合并,相同的全部合并


合并后


  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值