使用javascript合并表格
先打源代码发上来,未整理成OO形式.
/*
* 说明:
* 可以给表格添加priority属性,取值为数字,为1时表格列优先行合并,默认为1
* 表格第一列为标题列,列数以第一列为基准,
* 列合并设置 : 在列元素上添加 rowspaned 或 rowspaned='true'属性
* 行合并设置 : 在列元素上添加 colspans=N ,N为正整数意思是最多可向右合并几列
* 如果整个表格中的行都要合并请设置第一列的colspans超过表格列最大值
* 的数,并且其它列取消colspans设置值
*
*/
1

String.prototype.trim = function()
{ 2
return this.replace(/(^\s*)|(\s*$)/g, ""); 3
} 4
5

function $(element)
{ 6

if (arguments.length > 1)
{ 7
for (var i = 0, elements = [], length = arguments.length; i < length; i++) 8
elements.push($(arguments[i])); 9
return elements; 10
} 11
if (typeof element == 'string') 12
element = document.getElementById(element); 13
return element; 14
} 15
16

/**//*合并表格*/ 17

function spantable(element)
{ 18
element = $(element);//得到element 19

if(!element)
{ 20
return; 21
} 22
23
var body = element.getElementsByTagName('TBODY'); 24
25

if(!body)
{ 26
body = element; 27
} 28

29

if(0==body.length)
{ 30
return; 31
} 32
body = body[0]; 33
34

if('TBODY'!=body.tagName)
{ 35
return; 36
} 37
38
var priority = parseInt(body.parentNode.priority,10);//表格合并的优先顺序,默认列优先于行的合并 39
40

if(isNaN(priority))
{ 41
priority = 1; 42
} 43
44
var rows = body.childNodes; 45
46

if(0==rows.length)
{ 47
return; 48
} 49
50
var title = rows[0].cells;//标题行,记录每列合并的属性 51

if(0==title.length)
{ 52
return; 53
} 54
55
var cells , cell ,currcell , rowspan ,next ,deletecells; 56
57
var row,colspans,colspan; 58
59
deletecells = []; 60
colspans = []; 61
62

this.colspan = function(title,rows,deletecells)
{//列合并函数 63
var cells , cell ,currcell , rowspan ,next; 64

for(var i=0;i<title.length;i++)
{ 65
cell = title[i]; 66

if('undefined'==typeof cell.rowspaned)
{//当前列不进行合并 67
continue; 68
} 69

if('true'==cell.rowspaned.toString())
{ 70
continue; 71
} 72
next = true; 73

for(var j=1;j<rows.length;j++)
{ 74
currcell = rows[j].cells[i];//得到当前单元格 75

if(cell==currcell)
{ 76
continue; 77
} 78

if(next)
{//开始合并下一个 79
rowspan = 1; 80
next = false; 81
} 82

if(cell.innerText.trim()==currcell.innerText.trim())
{ 83
deletecells.push(currcell); 84
rowspan ++; 85

} else
{ 86

if(rowspan<2 && rowspan<=cell.rowSpan)
{//当前设置的rowspan大于计算出出来的rowsapn 87
cell = currcell; 88

} else
{ 89
next = true; 90
cell.rowSpan = rowspan; 91
92
cell = rows[j].cells[i];//移到本列的下个单元格 93
} 94
} 95
} 96

if(rowspan>cell.rowSpan)
{ 97
next = true; 98
cell.rowSpan = rowspan; 99
} 100
} 101
} 102
103

this.rowspan = function(title,rows,deletecells)
{//行合并函数 104
var row,colspans,colspan,next,cell ,currcell; 105
colspans = []; 106
107

for(var j=0;j<title.length;j++)
{ 108
colspan = parseInt(title[j].colspans || 0 ,10);//可合并多少行 109

if(isNaN(colspan))
{ 110
colspan = 0;//默认不进行约束 111
} 112
colspans.push(Math.max(0,Math.min(title.length-j , colspan)));//向右合并多少行 113
114
} 115

for(var i=0;i<rows.length;i++)
{ 116
row = rows[i]; 117
cell = row.cells[0]; 118

for(var j=0;j<colspans.length;j++)
{//所有行 119

if(colspans[j]>0)
{ 120
cell = row.cells[j]; 121
next = true; 122
} 123

if(next)
{ 124
next = false; 125
colspan = 1; 126
} 127
128

for(var k=0;k<colspans[j];k++)
{ 129
currcell = row.cells[j+k]; 130

if(cell==currcell)
{ 131
continue; 132
} 133

if(cell.innerText.trim()==currcell.innerText.trim())
{ 134
deletecells.push(currcell); 135
colspan ++; 136

} else
{ 137

if(colspan<2 && colspan<=cell.colSpan)
{//当前设置的colspan大于计算出出来的colspan 138
cell = currcell; 139

} else
{ 140
next = true; 141
cell.colSpan = colspan; 142
k++; 143

if(j+k<title.length)
{ 144
cell = row.cells[j+k];//移到下一个单元格 145
} 146
} 147
} 148
} 149
150

if(colspan>cell.colSpan)
{ 151
cell.colSpan = colspan; 152
next = true; 153
} 154
155
j = j+ colspans[j];//移到到下个修改点 156

if(j<colspans.length)
{ 157
cell = row.cells[j]; 158
} 159
} 160
161

if(colspan>cell.colSpan)
{ 162
cell.colSpan = colspan; 163
next = true; 164
} 165
} 166
} 167
168

if(1==priority)
{ 169
this.colspan(title,rows,deletecells); 170
this.rowspan(title,rows,deletecells); 171

} else
{ 172
this.rowspan(title,rows,deletecells); 173
this.colspan(title,rows,deletecells); 174
} 175
176

for(var i in deletecells)
{ 177
cell = deletecells[i]; 178
cell.parentNode.removeChild(cell); 179
} 180
181
// alert(element.outerHTML); 182
}183

找不到上传文件的地,只有发布到资源中了:测试页面

浙公网安备 33010602011771号