JQuery實現表格動態增加行並對新行添加事件


實現功能:

通常在編輯表格時表格的行數是不確定的,如果一次增加太多行可能導致頁面內容太多,反應變慢;通過此程序實現表格動態增加行,一直保持最下面有多個空白行。

效果:

一:原始頁面

二:表1增加新行並綁定timepicker

三:表2自動增加行,新行綁定timepicker

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
129
130
131
132
133
134
135
<!DOCTYPE html>
< html xmlns = "https://www.w3.org/1999/xhtml" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" />
< title ></ title >
< link href = "../Script/jquery-easyui-1.3.2/themes/default/easyui.css" rel = "external nofollow" rel = "stylesheet" />
< style >
.autoRows{
width: 350px; border:1px green solid;
}
.autoRows tbody tr td{
border-bottom:1px green solid;
margin:0px;
}
.autoRows thead{
background-color:#8ec7d7;
}
.autoRows tfoot {
background-color: #8ec7d7;
}
</ style >
</ head >
< body >
< table border = "0" cellspacing = "0" id = "table1" class = "autoRows" >
< thead >
< tr >
< th >表頭1</ th >
< th >表頭1</ th >
< th >表頭1</ th >
</ tr >
< tr >
< th >表頭2</ th >
< th >表頭2</ th >
< th >表頭2</ th >
</ tr >
</ thead >
< tbody >
< tr >
< td >
< input id = "Button1" type = "button" value = "insertAfter" onclick = "addrow(this);" /></ td >
< td >
< input id = "Button3" type = "button" value = "Clear" onclick = "$.fn.tableAutoRow.clearRowData(this, 2, 2, false);" /></ td >
< td >
< input id = "Text2" type = "text" value = "aaaa" /></ td >
</ tr >
< tr >
< td >
< input id = "Button2" type = "button" value = "insertBefore" onclick = "$.fn.tableAutoRow.insertRow(this,1,true,false);" /></ td >
< td >
< input id = "Button4" type = "button" value = "Reset" onclick = "$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></ td >
< td >
< input id = "Text1" name = "ttt" type = "text" value = "asdfasfasfdsd" /></ td >
</ tr >
< tr >
< td >
< input id = "Button5" type = "button" value = "insertBefore" onclick = "$.fn.tableAutoRow.insertRow(this,1,true,false);" /></ td >
< td >
< input id = "Button6" type = "button" value = "Reset" onclick = "$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></ td >
< td >
< input id = "Text3" type = "text" name = "Text3" /></ td >
</ tr >
</ tbody >
< tfoot >
< tr >
< th >表尾1</ th >
< th >表尾2</ th >
< th >表尾3</ th >
</ tr >
</ tfoot >
</ table >
< p style = "height:20px;" ></ p >
< table border = "0" cellspacing = "0" id = "table2" class = "autoRows" >
< thead >
< tr >
< th >表頭1</ th >
< th >表頭1</ th >
< th >表頭1</ th >
</ tr >
< tr >
< th >表頭2</ th >
< th >表頭2</ th >
< th >表頭2</ th >
</ tr >
</ thead >
< tbody >
< tr >
< td >
< input id = "Button7" type = "button" value = "insertAfter" onclick = "addrow(this);" /></ td >
< td >
< input id = "Button8" type = "button" value = "Clear" onclick = "$.fn.tableAutoRow.clearRowData(this, 2, 2, false);" /></ td >
< td >
< input id = "Text4" type = "text" value = "aaaa" /></ td >
</ tr >
< tr >
< td >
< input id = "Button9" type = "button" value = "insertBefore" onclick = "$.fn.tableAutoRow.insertRow(this, 1, true, false);" /></ td >
< td >
< input id = "Button10" type = "button" value = "Reset" onclick = "$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></ td >
< td >
< input id = "Text5" name = "ttt" type = "text" value = "asdfasfasfdsd" /></ td >
</ tr >
< tr >
< td >
< input id = "Button11" type = "button" value = "insertBefore" onclick = "$.fn.tableAutoRow.insertRow(this, 1, true, false);" /></ td >
< td >
< input id = "Button12" type = "button" value = "Reset" onclick = "$.fn.tableAutoRow.clearRowData(this, 2, 2, true);" /></ td >
< td >
< input id = "Text6" type = "text" name = "Text3" /></ td >
</ tr >
</ tbody >
< tfoot >
< tr >
< th >表尾1</ th >
< th >表尾2</ th >
< th >表尾3</ th >
</ tr >
</ tfoot >
</ table >
</ body >
</ html >
< script src = "../Script/jquery-1.7.2.min.js" ></ script >
< script src = "../Script/jquery.tableAutoRow.js" ></ script >
< script src = "../Script/jquery-easyui-1.3.2/jquery.easyui.min.js" ></ script >
< script src = "../Script/jquery.timepicker.js" ></ script >
< script type = "text/javascript" >
$(function () {
$(".autoRows").tableAutoRow(aaa);
function aaa(row) {
$(row).find(':text').timepicker();
}
});
function addrow(obj) {
$.fn.tableAutoRow.insertRow(obj);
}
</ script >

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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
/// <reference path="jquery-1.7.2.min.js" />
//為表格主體添加單擊事件,當單擊時添加行數,使表格保持有n個空行
( function ($) {
$.fn.extend({
rowfunction: null ,
tableAutoRow: function (newRowFunction) {
rowfunction = newRowFunction;
return $( this ).each( function () {
var tb = this ;
if (!( this .tagName.toUpperCase() == "TBODY" )) {
if (! this .tBodies[0]) {
return ;
} else {
tb = this .tBodies[0];
}
}
 
//添加一個隱藏行,后面新增行復制此行
var lastRow = tb.rows[tb.rows.length - 1];
var row = $(lastRow).clone( true , true );
$(row).insertAfter($(tb).find( "tr:last" )).hide();
 
//為除所有行添加事件,當獲得焦點時自動增加新行
for ( var i = 0; i < tb.rows.length; i++) {
AddAutoRowsEvent(tb.rows[i]);
}
});
}
});
//自動增加行
function autoRows(e) {
var e = e || event;
var obj = e.target || e.srcElement;
while (obj.tagName != "TR" ) {
obj = obj.parentNode;
}
var tb = obj.parentNode;
var index = $(obj).index();
var n = 5 - (tb.rows.length - index);
if (n > 0) {
var lastRow = tb.rows[tb.rows.length - 1];
for ( var j = 0; j < n; j++) {
var row = $(lastRow).clone( true , true );
//將新行添加到最后一行之前
row.insertBefore($(tb).find( "tr:last" )).show();
//為新增加的行添加事件
//AddAutoRowsEvent(tb.rows[tb.rows.length - 2]);
//如果有回調函數則執行
if ( typeof (rowfunction) == 'function' ) {
rowfunction(row);
}
}
}
}
 
//為指定行增加事件
function AddAutoRowsEvent(tr) {
//如果是JQuery對象則轉為HTML對象
if (tr instanceof jQuery) {
tr = tr[0];
}
 
$(tr).bind( 'click' , autoRows);
var c = tr.cells.length;
for ( var j = 0; j < c; j++) {
var childs = tr.cells[j].childNodes;
for ( var k = 0; k < childs.length; k++) {
if (childs[k].type == "text" || childs[k].type == "textarea" || childs[k].type == "button" ) {
$(childs[k]).bind( 'focus' , autoRows);
}
}
}
}
 
//在表格中指定位置插入指定行數,新插入的行內容為同一表格主體最后一行
//obj:行內的任意對象
//n:要增加的行數
//bAutoRows:是否要添加自動增加行的屬性
$.fn.tableAutoRow.insertRow = function (obj, n, bAutoRows, isInsertAfter) {
var loop = 0; //加入循環次數,防止死循環
while (obj.tagName != "TR" && loop < 10) {
obj = obj.parentNode;
loop++;
}
if (obj.tagName != "TR" ) {
return ;
}
var tb = obj.parentNode;
switch (arguments.length) {
case 3:
var isInsertAfter = true ;
case 2:
var bAutoRows = true ;
var isInsertAfter = true ;
case 1:
var bAutoRows = true ;
var isInsertAfter = true ;
var n = 1;
}
for ( var i = 0; i < n; i++) {
var lastRow = tb.rows[tb.rows.length - 1];
 
var row = $(lastRow).clone( true , true );
//將新行添加到當前行之前/后
if (isInsertAfter) {
row.insertAfter(obj).show();
} else {
row.insertBefore(obj).show();
}
if (bAutoRows) {
AddAutoRowsEvent(row);
}
}
}
//清除指定行數據
//obj為行或者行內的節點
//startColnum:起始列
//endColumn:終止列
//isReset:是否恢復到初始值
$.fn.tableAutoRow.clearRowData = function (obj, startColnum, endColumn, isReset) {
var loop = 0; //加入循環次數,防止死循環
while (obj.tagName != "TR" && loop < 10) {
obj = obj.parentNode;
loop++;
}
if (obj.tagName != "TR" ) {
return ;
}
var cellsCount = obj.cells.length; //此行單元格總數
if (startColnum < 0 || !startColnum) { //如果未指定清除起始列則從第一列清除
startColnum = 0;
}
if (endColumn > cellsCount - 1 || !endColumn) { //如果未指定清除終止列則清除到最后一列前(通常最后一列用於放置清除按鈕)
endColumn = cellsCount - 1;
}
if (isReset == undefined) {
isReset = false ;
}
for ( var c = startColnum; c <= endColumn; c++) //循環各列,設置單元格里的控件值
{
for ( var j = 0; j < obj.cells[c].childNodes.length; j++) { //循環處理指定單元格中的子節點
var node = obj.cells[c].childNodes[j];
setObjData(node, isReset);
}
}
};
function setObjData(node, isReset) {
switch (node.type) {
case "text" :
case "hidden" :
case "textarea" :
if (isReset) {
node.value = node.defaultValue;
} else {
node.value = "" ;
}
break ;
 
case "select-one" :
case "select-multiple" :
if (isReset) {
for ( var k = node.options.length - 1; k >= 0; k--) {
node.options[k].selected = node.options[k].defaultSelected;
}
} else {
for ( var k = node.options.length - 1; k >= 0; k--) {
//node.options.remove(k);
node.options[k].selected = false ;
}
}
break ;
case "checkbox" :
case "radio" :
if (isReset) {
node.checked = node.defaultChecked;
} else {
node.checked = false ;
}
break ;
}
if (node.childNodes && node.childNodes.length > 0) {
var l = node.childNodes.length;
for ( var i = 0; i < l; i++) {
setObjData(node.childNodes[i], isReset);
}
}
}
})(jQuery);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM