最近再做一个table的功能比较复杂,网上搜搜关于table列的添加也不是很多,这里写下关于jquery动态添加行列的情况,先分析下思路:
  首先是table行添加,只需要在table后面追加tr、td即可,涉及到顺序插入需要获取编号列,对其排序,获取到当前添加的编号索引,在找到相应的tr在其后面插入即可,这也是我为什么这里用到bootstrap模态框的原因;列添加只需要在每行tr的里面追加th或者td即可。当然涉及到table的删除、选择、编辑、排序将在后面的一篇文章里完善,敬请期待!

1、HTML布局、相关文件引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<body>
<div class="table-box">
<div class="container">
<table class="table table-bordered">
<thead>
<tr>
<th><span>时间</span></th>
<th>星期一</th>
<th>星期二</th>
<th>星期三</th>
<th>星期四</th>
<th>星期五</th>
</tr>
</thead>
<tbody class="table_body">
<tr>
<td>9</td>
<td>人生表一</td>
<td>表一</td>
<td>表一</td>
<td>生表一</td>
<td>人生表</td>
</tr>
<tr>
<td>10</td>
<td>人生表一</td>
<td>生表一</td>
<td>人生表一</td>
<td></td>
<td>表一</td>
</tr>
<tr>
<td>12</td>
<td>人生表一</td>
<td>人生表一</td>
<td></td>
<td>人生表一</td>
<td>人生表一</td>
</tr>
<tr>
<td>16</td>
<td>人生表一</td>
<td>人生表一</td>
<td>人生表一</td>
<td>人生表一</td>
<td>人生表一</td>
</tr>
<tr>
<td>18</td>
<td>单元表</td>
<td>单元表表</td>
<td>单元表</td>
<td>单元表</td>
<td>单元表</td>
</tr>
<tr>
<td>19</td>
<td>人生表一</td>
<td>生表一</td>
<td></td>
<td></td>
<td>表一</td>
</tr>
</tbody>
</table>
<!--button-->
<div class="btn-group" role="group" aria-label="">
<button type="button" class="btn btn-default" id="addrowbtn" data-toggle="modal" data-target="#rowModal">添加行</button>
</div>
<div class="btn-group" role="group" aria-label="">
<button type="button" class="btn btn-default" id="addcolbtn" data-toggle="modal" data-target="#colModal">添加列</button>
</div>
<!--addRow模态框-->
<div class="modal fade" id="rowModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="exampleModalLabel">添加新行</h4>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="recipient-time" class="control-label">填写行编号:</label>
<input type="text" class="form-control" id="recipient-time">
</div>
<div class="form-group">
<label for="message-text" class="control-label">描述(可选):</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" data-dismiss="modal" id="confirmrow">确认</button>
</div>
</div>
</div>
</div>
<!--addCol模态框-->
<div class="modal fade" id="colModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="exampleModalLabel">添加新列</h4>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label for="recipient-date" class="control-label">填写列头信息:</label>
<input type="text" class="form-control" id="recipient-date">
</div>
<div class="form-group">
<label for="message-text" class="control-label">描述(可选):</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" data-dismiss="modal" id="confirmcol">确认</button>
</div>
</div>
</div>
</div>
</div>
</div>
</body>

需要引入的文件

1
2
3
4
5
<link rel="stylesheet" href="css/bootstrap.css" />
<link rel="stylesheet" href="css/style.css" />
<script type="text/javascript" src="js/jquery-1.11.1.min.js" ></script>
<script type="text/javascript" src="js/jquery.table.js" ></script>
<script type="text/javascript" src="js/bootstrap.js" ></script>

2、在script标签写入javascript

首先获取table的行列数,便于后面使用。代码写在$(fuction(){})里,这里说明一下,添加行,添加列,获取table行列数是通过jquery扩展的形式放在jquery.table.js里面。

1
2
3
4
5
var $table, rowcol, row_num, col_num, allcols;
$table = $(".table");
rowcol = $table.getrowcol(); //$表格行列
row_num = rowcol.rows;
col_num = rowcol.cols;

模态框确定按钮触发添加行和列函数:

1
2
3
4
5
6
7
8
9
10
11
12
$("#confirmrow").on("click",function(){
var trlength = $(".table tr:first").find("th").length;
var newtime = $("#recipient-time").val();
allcols = getCols(".table",0);
allcols.shift(); //除第一项的所有编号列
$(".table").addrow($table,allcols,trlength,newtime); //$添加行
});

$("#confirmcol").on("click",function(){ //$添加列
var newdate = $("#recipient-date").val();
$(".table").addcol($table,row_num,newdate);
});

为了顺序插入我们需要创建一个获取列的函数:

1
2
3
4
5
6
7
8
9
10
11
12
function getCols(selector,curCol){
var allcol = [],
selector = selector || "",
curIndex = curIndex || "";
$(selector + " tr").each(function(index){
var e_row = $(this).children().eq(curIndex);
allcol.push(e_row);
});

allcol = allcol.length > 0 ? allcol : ""; //全列数组
return allcol;
}

3、获取table行列数、添加行、添加列在jquery中的扩展
  
  在jquery.table.js中写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(function ($) {
$.fn.extend({
getrowcol: function(){ //获取table 行列数
var obj;
this.each(function(){
var row_num = $(this).find("tr").length; //行
var col_num = $(this).find("td").length / (row_num - 1); //列
obj = {rows: row_num, cols: col_num};
});
return obj;
},

addrow: function(table,arrcols,trlen,time){ //传 表格selector、编号列、tr长度、新增编号 参数 用于顺序插入
return this.each(function(){
var arr = [];
$(arrcols).each(function(){
arr.push($(this).text());
});
arr.push(time);
arr.sort(function(x,y){
x = parseInt(x);
y = parseInt(y);
if(x<y){
return -1;
}
if(x>y){
return 1;
}
return 0;
});
var index = arr.indexOf(time);
var _html;
for(var i = 1;i < trlen; i++){ //tr的长度就是需要td的个数
_html += "<td></td>";
}
table.find("tr").eq(index).after("<tr><td>"+time+"</td>"+_html+"</tr>");
});
},

addcol: function(table,rownum,newdate){ //传参数: 表格selector、新列
return this.each(function(){
$("tr:first",this).append("<th>"+newdate+"</th>");
$("tr:gt(0)",this).each(function(){
$(this).append("<td></td>");
});
});
}

});
})(jQuery);

查看演示

**更多table强大功能敬请待续…如有不足之处,多多指教!