自动合并表格单元格(二)

303 阅读1分钟

1、效果

如果第一列合并,那么根据输入参数 length,对后面的列进行自动合并。适用于第一列判断合并时,后面几列和第一列一样,也需要合并的场景。

image.png

2、html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<link rel="stylesheet" href="./css/index.css">
		<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
		<script src="./js/index3.js"></script>
	</head>
	<body>
		<table id='tbTest'>
			<thead>
				<tr>
					<th>标题</th>
					<th>标题</th>
					<th>标题</th>
					<th>标题</th>
					<th>标题</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td>test1</td>
					<td>test2</td>
					<td>test1</td>
					<td>test3</td>
					<td>test3</td>
				</tr>
				<tr>
					<td>test1</td>
					<td>test2</td>
					<td>test1</td>
					<td>test3</td>
					<td>test3</td>
				</tr>
				<tr>
					<td>test4</td>
					<td>test4</td>
					<td>test4</td>
					<td>test3</td>
					<td>test3</td>
				</tr>
				<tr>
					<td>test1</td>
					<td>test1</td>
					<td>test5</td>
					<td>test7</td>
					<td>test2</td>
				</tr>
				<tr>
					<td>test1</td>
					<td>test1</td>
					<td>test5</td>
					<td>test7</td>
					<td>test2</td>
				</tr>
			</tbody>
		</table>
	</body>
</html>

2、css

table, th,td{
    border: 1px solid #000000;
    border-collapse: collapse;
	padding:8px 30px;
}
tr{
    height:35px;
}

3、js

/**
 * 合并单元格
 * table_id:表格id或class
 * length:合并的列数,从左到右
 **/ 
function megeCell([table_id,length=1]) {
	var startIndex
	var startValue
	var count = 0
	var arrTds = []
	var addAttrData = []
	$(table_id).find('tr').find('td:eq('+0+')').each(function(){
		arrTds.push($(this).text())
	})
	var addClass = (index,className) => {
		for(let i=0;i<length;i++){
			$(table_id).find('tr:eq('+index+')').find('td:eq('+i+')').addClass(className)
		}
	}
	var addAttr = (startIndex) => {
		addClass(startIndex,'addAttr'+startIndex)
		var obj = {class:'.addAttr'+startIndex, count:count + 1}
		addAttrData.push(obj)
	}
	var removeEle = (startIndex) => {
		for(let j=1;j<=count;j++){
			addClass(startIndex+j,'removeEle')
		}
	}
	arrTds.forEach((item,index)=>{
		if(index === 0){
			startValue = item
			return
		}
		if(item === startValue && count === 0){
			startIndex = index
			count++
			addAttr(startIndex)
			removeEle(startIndex)
			return
		}
		if(item === startValue && count > 0){
			count++
			addAttr(startIndex)
			removeEle(startIndex)
			return
		}
		
		startValue = item
		startIndex = index
		count = 0
	})
	
	addAttrData.forEach((item)=>{
		$(item.class).attr('rowspan',item.count)
	})
	$('.removeEle').remove()
}


setTimeout(()=>{
	megeCell(['#tbTest',4])
})