欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javascript根据单元格内容动态合并相同内容单元格

程序员文章站 2024-02-28 17:32:10
...

记录下,按照自己的思维流程写的代码,难免有冗余和不合理的地方,着急要用,也懒得优化,适用于有合并前两列中相同内容单元格需求的地方。如有有人能受到启发写出更加好用完美的代码,那我会感到非常高兴。另外发现网上已经有人写了不少这方面的例子,但是都有BUG,我这段代码也欢迎大家测试,有什么不足欢迎评论。

	function HB(tableId) {

		var tab = document.getElementById(tableId);
		var tabRows = tab.rows.length;//取得表格的行数
		var startRow = 0;//第一列种子索引
		var rowNum = 0;//第一列合并的行数操作数
		var addNum=1;//第二列合并行数操作数,第二列合并的行数不会超过第一列合并的行数
		var startRow2 = 0;//第二列种子索引
		var cell=0;//第二列合并操作种子标记,当第一个合并的单元格完成监测后,将种子置为-1
		for (var i = 0; i < tabRows; i++) {//合并第一列相同单元格
			if (i == 0) {
				startRow = i;
				rowNum++;
				continue;
			}
			if (tab.rows[startRow].cells[0].innerHTML == tab.rows[i].cells[0].innerHTML) {
				tab.rows[i].removeChild(tab.rows[i].cells[0]);
				rowNum++;
				if(startRow==(i+1-rowNum)){
					tab.rows[startRow].cells[0].rowSpan = rowNum;
				}
				continue;
			}
				//新合并第二列
				addNum=1;
				cell=0;
				for(var n=0;n<rowNum;n++){
					if(n==0){
						startRow2=startRow;//首次进入,第一行的第二列作为种子
						continue;
					}
					//alert("tab.rows["+startRow2+"].cells["+(cell+1)+"].innerHTML"+tab.rows[startRow2].cells[cell+1].innerHTML);
					//alert("tab.rows["+(startRow2+addNum)+"].cells[0].innerHTML"+tab.rows[startRow2+addNum].cells[0].innerHTML);
					if(tab.rows[startRow2].cells[cell+1].innerHTML==tab.rows[startRow2+addNum].cells[0].innerHTML){
						if(n==rowNum-1){
							//alert("最后一次循环发现合并");
							tab.rows[startRow2+addNum].removeChild(tab.rows[startRow2+addNum].cells[0]);
							addNum++;
							tab.rows[startRow2].cells[cell+1].rowSpan=addNum;
							break;
						}
						tab.rows[startRow2+addNum].removeChild(tab.rows[startRow2+addNum].cells[0]);
						addNum++; 
						//alert("addNum:"+addNum);
						continue;
					}
					//alert("出来了!!!"+n);
					if(addNum==1){
						//alert("下方没有找到相同的合并项,作为种子继续寻找");
					}
					tab.rows[startRow2].cells[cell+1].rowSpan=addNum;
					//设置新种子索引
					startRow2=startRow2+addNum;
					cell=-1;
					addNum=1;
				}  
			tab.rows[startRow].cells[0].rowSpan = rowNum;
			startRow = i;
			rowNum = 1;
		}
	}