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

Code
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
找不到上传文件的地,只有发布到资源中了:测试页面
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述