表格合并之表头分级合并
合并前后效果图:
完整demo:
<!DOCTYPE HTML>
<html>
<head>
<title>table.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<!-- Latest compiled and minified JavaScript -->
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<style type="">
body{
padding: 5px;
}
.tb-content {
color: #666666;
font-size: 12px;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
.tb-content>thead>tr>td{
text-align: center;
}
.tb-content>thead>tr th {
text-align: center;
}
.tb-content>thead>tr:nth-child(1) th {
color: #000000;
text-align: center;
background: #efefef;
}
.table>thead>tr>th, .table>tbody>tr>th,
.table>tfoot>tr>th, .table>thead>tr>td,
.table>tbody>tr>td, .table>tfoot>tr>td{
vertical-align: middle;
}
</style>
</head>
<body>
<table id="combonTb" class="tb-content table table-striped table-hover table-bordered">
<thead>
<tr>
<th>属性</th><th>属性</th><th>属性</th><th>属性</th>
<th>塔高</th><th>塔高</th><th>塔高</th><th>塔高</th><th>塔高</th><th>塔高</th>
<th>站址类型</th><th>站址类型</th><th>站址类型</th><th>站址类型</th>
<th>站址</th><th>站址</th>
<th>详情</th>
</tr>
<tr>
<th>系统</th><th>表</th><th>表</th><th>表</th>
<th>塔编码</th><th>塔编码</th><th>塔名</th><th>塔名</th><th>塔身</th><th>塔身</th>
<th>站编码</th><th>站编码</th><th>站名</th><th>站名</th>
<th>站名</th><th>站名</th>
<th></th>
</tr>
<tr>
<th>ios</th><th>ios</th><th>ios</th><th>table</th>
<th>11</th><th>12</th><th>14</th><th>14</th><th>14</th><th>14</th>
<th>code_a</th><th>code_a</th><th>code_b</th><th>code_a</th>
<th>铁塔</th><th>铁塔</th>
<th></th>
</tr>
</thead>
</table>
<button onclick="headRowspan('#combonTb')">合并head</button>
</body>
<script>
/**
* 合并头,上一行的分组会约束下一行的分组(类似公司、部门、小组这种隶属层级约束)
* 思路:建立分组索引,索引含有该分组的起始坐标(用于jquery的切片选取操作$(selecter).slice(index,indexEnd))
* 合并当前行时,同时建立新的分组索引,用于下一行分组。
*/
function headRowspan(selecter,bool){
var indexsArray = [],/*分组信息*/ headTRs = $(selecter).find("thead>tr");
if(bool == true) $(selecter).find("thead>tr:last").hide();
$.each(headTRs,function(index,trItem){
var innerIndexsArray = [],ths = $(trItem).children();
if(indexsArray.length>0){
$.each(indexsArray,function(n,m){
var segmentTHs = ths.slice(m.pre,m.end+1),tempIndexArray = [];
tempIndexArray = combinTH(segmentTHs,m.pre);
$.each(tempIndexArray,function(indx,jsonItem){/*构建新的分组索引*/
innerIndexsArray.push(jsonItem);
});
});
indexsArray = innerIndexsArray;
}else indexsArray = combinTH(ths,0);
});
var count = headTRs.eq(0).children().size()-1,preTd = null;
for(var i=count;i>=0;i--){/*纵向合并*/
$.each(headTRs,function(index,trItem){
var curTd = $(trItem).children().eq(i);
if(index == 0){
preTd = curTd;
}else{/*只对显示的单元设置合并属性,应再判断上下两个td的colspan是否相同,不同不应该合*/
var preTxt = preTd.text(),curTxt = curTd.text();
if(curTxt && preTxt==curTxt && preTd.is(":visible")){
var rowNum = (preTd.attr("rowspan") || 1)-0;
preTd.attr("rowspan",rowNum+1);
curTd.hide();
}else{
preTd = curTd;
}
}
});
}
function combinTH(ths,baseIndex){/*横向合并*/
var indexsArray = [],preTH = null;
$.each(ths,function(n,m){
if(n==0){
preTH = $(m);
indexsArray.push({pre:baseIndex+0,end:baseIndex+0});
}else{
var preTxt = preTH.text(),curTH = $(m),curTxt = curTH.text();
if(preTxt && preTxt==curTxt){
var indexObj = indexsArray[indexsArray.length-1];
indexObj.end += 1;
var colspanNum = indexObj.end - indexObj.pre + 1;
preTH.attr("colspan",colspanNum);
curTH.hide();
}else{
preTH = $(m);
indexsArray.push({pre:baseIndex+n,end:baseIndex+n});
}
}
});
return indexsArray;
}
}
</script>
</html>