JQuery实现表格动态增加行并对新行添加事件


Posted in Javascript onJuly 30, 2014

实现功能:

通常在编辑表格时表格的行数是不确定的,如果一次增加太多行可能导致页面内容太多,反应变慢;通过此程序实现表格动态增加行,一直保持最下面有多个空白行。

效果:

一:原始页面

二:表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="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> 
<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.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);
Javascript 相关文章推荐
JavaScript实现拼音排序的方法
Nov 20 Javascript
Javascript图像处理—亮度对比度应用案例
Jan 03 Javascript
关于jQuery判断元素是否存在的问题示例探讨
Jul 21 Javascript
JS自定义对象实现Java中Map对象功能的方法
Jan 20 Javascript
jquery实现Li滚动时滚动条自动添加样式的方法
Aug 10 Javascript
第二章之Bootstrap 页面排版样式
Apr 25 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
详解用webpack2搭建angular2的项目
Jun 22 Javascript
跨域请求两种方法 jsonp和cors的实现
Nov 11 Javascript
用vuex写了一个购物车H5页面的示例代码
Dec 04 Javascript
VUE动态生成word的实现
Jul 26 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 Javascript
jQuery修改CSS伪元素属性的方法
Jul 30 #Javascript
教你在heroku云平台上部署Node.js应用
Jul 30 #Javascript
浅析Node在构建超媒体API中的作用
Jul 30 #Javascript
JS实现图片无间断滚动代码汇总
Jul 30 #Javascript
使用jquery.upload.js实现异步上传示例代码
Jul 29 #Javascript
js动态添加onclick事件可传参数与不传参数
Jul 29 #Javascript
使用focus方法让光标默认停留在INPUT框
Jul 29 #Javascript
You might like
PHP之变量、常量学习笔记
2008/03/27 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
BootStrap表单时间选择器详解
2017/05/09 Javascript
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
实现jquery放大镜的两种方法
2018/02/22 jQuery
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
js实现翻牌小游戏
2020/07/31 Javascript
Python内置函数bin() oct()等实现进制转换
2012/12/30 Python
python使用cookie库操保存cookie详解
2014/03/03 Python
python正则表达式爬取猫眼电影top100
2018/02/24 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
在python 中实现运行多条shell命令
2019/01/07 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
django2笔记之路由path语法的实现
2019/07/17 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
团日活动总结书格式
2014/05/08 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
2014年政工师工作总结
2014/12/18 职场文书
2015年环卫处个人工作总结
2015/07/27 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记
python井字棋游戏实现人机对战
2022/04/28 Python
Docker部署Mysql8的实现步骤
2022/07/07 Servers