自动合并表格单元格

103 阅读1分钟

1、效果

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/index.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>test1</td>
					<td>test1</td>
					<td>test3</td>
					<td>test3</td>
				</tr>
				<tr>
					<td>test1</td>
					<td>test1</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>test6</td>
					<td>test8</td>
					<td>test2</td>
				</tr>
			</tbody>
		</table>
	</body>
</html>

3、js

/**
 * 合并单元格
 * table_id:表格id或class
 * length:合并的列数,从左到右
 **/ 
function megeCell([table_id,length=0]) {
	var addAttrData = []
	var removeEleData = []
	var rowLength = length>0 ? length : $(table_id).find('tr').find('th').length
	for(let i=0;i<rowLength;i++){
		var startIndex
		var startValue
		var count = 0
		var arrTds = []
		$(table_id).find('tr').find('td:eq('+i+')').each(function(){
			arrTds.push($(this).text())
		})
		var addAttr = (startIndex) => {
			var obj = {}
			$(table_id).find('tr:eq('+startIndex+')').find('td:eq('+i+')').addClass(i+'addAttr'+startIndex)
			obj.class = '.'+i+'addAttr'+startIndex
			obj.count = count + 1
			addAttrData.push(obj)
		}
		var removeEle = (startIndex) => {
			for(let j=1;j<=count;j++){
				$(table_id).find('tr:eq('+(startIndex+j)+')').find('td:eq('+i+')').addClass(i+'removeEle'+(startIndex+j))
				removeEleData.push('.'+i+'removeEle'+(startIndex+j))
			}
		}
		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)
	})
	removeEleData.forEach((item)=>{
		$(item).remove()
	})
}


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

4、css

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