实现功能:
通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢;通过此程序实现表格动态增加行,一直保持最下面有多个空白行。
效果:
一:原始页面
二:表1增加新行并绑定timepicker
三:表2自动增加行,新行绑定timepicker
源码
HTML源码:
<!DOCTYPE html> <html xmlns="http://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="stylesheet" /> <style> .autoRows{ 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> <div style="height:20px;"></div> <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源码:
/// <reference path="jquery-1.11.1.min.js" /> //为表格主体添加单击事件,当单击时添加行数,使表格保持有n个空行 (function ($) { $.fn.extend({ tableAutoRow: function (rowfunction) { return $(this).each(function () { var tb = this; if (!(this.tagName.toUpperCase() == "TBODY")) { if (!this.tBodies[0]) { return; } else { tb = this.tBodies[0]; } } //记录当前行数 var rowsCount = tb.rows.length; //添加一个隐藏行,为了避免事件重复绑定,后面新增行复制此行 var lastRow = tb.rows[tb.rows.length - 1]; if (!$(lastRow).is(":hidden")) { var row = $(lastRow).clone(true, true); $(row).insertAfter($(tb).find("tr:last")).hide(); } //绑定事件到行、单元格,单击时添加行 $(tb).on('click', 'td,tr', function (e) { autoRows(e, rowfunction); }); //绑定事件到input元素,当获取焦点或者单击时添加行 $(tb).on('focus', 'input', function (e) { autoRows(e, rowfunction); }); //单击第一行,初始化 tb.rows[rowsCount - 1].click(); //对原有行添加事件 if (typeof (rowfunction) == 'function') { for (var i = 0 ; i < rowsCount; i++) { rowfunction(tb.rows[i]); } } }); } }); //自动增加行 function autoRows(e, rowfunction) { 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(); //如果有回调函数则执行 if (typeof (rowfunction) == 'function') { rowfunction(row); } } } } $.fn.tableAutoRow.deleteRow = function (obj) { if (!confirm('确定删除此行?')) { return; } var loop = 0; //加入循环次数,防止死循环 while (obj.tagName != "TR" && loop < 10) { obj = obj.parentNode; loop++; } if (obj.tagName != "TR") { return; } if (obj.parentNode.rows.length == 2) { alert('不能删除全部行'); return; } else { $(obj).remove(); } } //在表格中指定位置插入指定行数,新插入的行内容为同一表格主体最后一行 //obj:行内的任意对象 //n:要增加的行数 //isInsertAfter:插入在当前行的后面,否则在前面 $.fn.tableAutoRow.insertRow = function (obj, n, 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 2: var isInsertAfter = true; case 1: 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(); } } } //清除指定行数据 //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++)<span style="white-space:pre"> </span>//循环各列,设置单元格里的控件值 { 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); $(function(){ $('.autoRows').tableAutoRow(); });