JavaScript 动态添加表格行 使用模板、标记


Posted in Javascript onOctober 24, 2009

对于复杂的操作情况,比如:添加一行之后,在这一行上还要进行相关的操作会显得有些吃力;本人比较喜欢表现层使用模板、标记填充数据的做法,于是自己做手做了个小组件,与大家一起分享。

组件运行截图:

JavaScript 动态添加表格行 使用模板、标记
JavaScript 动态添加表格行 使用模板、标记
设计思路:

在Table的thead中加入一行隐藏的行,当要添加一行时,复制一次隐藏的行,再将实例数据填充到这一行中相应的位置,填充完毕之后,再将这一行加到表格中去,整个操作完成。
模板:隐藏的行即相当于模板,当需要时复制一次模板。
标记:将模板行复制出来后,该如何填充数据?

网上比较多的组件的做法是,传递进来两个数组,一组是元素名称列表,一组是对应的值列表,然后对复制出来的行进行一个查找,发现其中的元素的名称在元素名称列表中的,让其value=对应的值。这样做可以满足一般的需求,因为Table里面一般放置文本框,将值放到其中即完成任务。对于复杂的情况,要求将数据填充到其它的位置,这种方法就力不从心了。

我的做法是将复制进来的模板行看做一段String,在这段String中查找标记,再将数据填充到相应的标记中去,这样的话,无论你哪个地方要填充数据,只要放一个标记就可以了,比上面的做法要灵活很多。

代码实现(关键点讲解)

我定义的标志为${属性},传递过去的数据为一个entity,当在String中发现${city},则表示将entity.city的内容替换${city},当entity.city为NULL时,用 替换${city}( 网页中的空格)。

动态添加行方法

function addInstanceRow(tableId,names,values,functionName){ 
var tableObj=getTargetControl(tableId); 
var tbodyOnlineEdit=getTableTbody(tableObj); 
var theadOnlineEdit=tableObj.getElementsByTagName("THEAD")[0]; 
var elm=theadOnlineEdit.rows[theadOnlineEdit.rows.length-1].cloneNode(true); 
elm.style.display=""; 
if(typeof(names)!="undefined"){ 
if(typeof(functionName)=="undefined") functionName="setObjValueByName"; 
if(typeof(values)!="undefined"&&values!=null){ 
var entity=ArrayToObj(names,values); 
setInputValue(elm,entity,functionName); 
} 
else 
setInputValue(elm,names,functionName); 
} 
tbodyOnlineEdit.appendChild(elm); 
}

if(typeof(names)!="undefined"){ 
if(typeof(functionName)=="undefined") functionName="setObjValueByName"; 
if(typeof(values)!="undefined"&&values!=null){ 
var entity=ArrayToObj(names,values); 
setInputValue(elm,entity,functionName); 
} 
else 
setInputValue(elm,names,functionName); 
}

4,将填充好数据的行添加到表格中去

tbodyOnlineEdit.appendChild(elm);

难点、易出问题点说明

1, 获取Tbody,ie与firefox有区别,ie在默认的情况下是为table加上tbody的,而firefox则没有,所以要进行相应的判断

//得到table中的tbody控件,注意兼容firefox 
function getTableTbody(tableObj){ 
var tbodyOnlineEdit=tableObj.getElementsByTagName("TBODY")[0]; 
if(typeof(tbodyOnlineEdit)=="undefined"||tbodyOnlineEdit==null){ 
tbodyOnlineEdit=document.createElement("tbody"); 
tableObj.appendChild(tbodyOnlineEdit); 
} 
return tbodyOnlineEdit; 
}

2, 进行填充时,实现了两种情况,一种用根据元素的name,别一种则是根据标记填充
Code
// 动态添加表格行 
// functionname为“setObjValueByName”为根据元素name, 
//要求names为元素名称,value为相对应的值 
// 
//functionname为“”为标记填充 
//要求names为一个对象,value为null 
function addInstanceRow(tableId,names,values,functionName)

3, 进行标志的填充时,使用正则表达式进行标记的查找,找到标记后到entity中取相应的属性的值,取出属性的值之后,要用 替换字符串中的空格,不然显示时会有问题,当属性值为空时用 替换标记符号,代码在以下函数中。
Code
//根据标志设置添加值 
function setObjValueByFlag(obj,entity){ 
var objTemp=obj.parentNode; 
var arrMatches=objTemp.innerHTML.match(/\${\w+}/g); 
if(typeof(arrMatches)=="undefined"||arrMatches==null||typeof(arrMatches.length)=="undefined"||arrMatches.length==null) 
return; 
var tempValue=""; 
var propertyValue=""; 
for(var i=0;i<arrMatches.length;i++){ 
tempValue=arrMatches[i].replace(/\${|}/g,""); 
propertyValue=getEntityPropertyValue(entity,tempValue); 
if(propertyValue!=null){ 
if(typeof(propertyValue)=="string"){ 
if(propertyValue!="") 
propertyValue=propertyValue.replace(/\s/g," "); 
else 
propertyValue=" "; 
} 
objTemp.innerHTML=objTemp.innerHTML.replace(arrMatches[i],propertyValue); 
} 
else{ 
objTemp.innerHTML=objTemp.innerHTML.replace(arrMatches[i]," "); 
} 
} 
}

4, 对于填充标志的做法,刚开始的思路是,直接将模板行中的tr下的内容当成文本进行标志的替换,但是显示时没有内容,于是只能逐个把td中的内容对标志进行替换,发现显示时是正确的,这个地方使我有点困惑。很明显前者的做法效率更高,却莫名其妙地显不出来,只能退而求其次了。
函数调用说明
Code
//见上面说明,这是添加行最基本的对外函数 
function addInstanceRow(tableId,names,values,functionName) 
//添加实体列表添加表格中,有几个entity则添加几行 
//tableId 要动态添加行的Table的ID值 
//entityList 对象数组 Array类型, 
function addRowByEntityList(tableId,entityList) 
//将一个实体添加到一行 
function addRowByEntity(tableId,entity) 
//删除触发事件控件所在的行 
function deleteThisRow(targetControl) 
//删除表格下的所有行 
function deleteAllRow(tableId)

在IE6,7,firefox2,3测试没问题,有问题留言或邮件badwps@163.com,谢谢

打包下载

Javascript 相关文章推荐
不能再简单的无闪刷新验证码原理很简单
Nov 05 Javascript
js获取事件源及触发该事件的对象
Oct 24 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
Aug 06 Javascript
谈谈JSON对象和字符串之间的相互转换JSON.stringify(obj)和JSON.parse(string)
Oct 01 Javascript
javascript css红色经典选项卡效果实现代码
May 17 Javascript
jquery购物车结算功能实现方法
Oct 29 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
Aug 29 jQuery
让网站自动生成章节目录索引的多个js代码
Jan 07 Javascript
[原创]jquery判断元素内容是否为空的方法
May 04 jQuery
vue中各种通信传值方式总结
Feb 14 Javascript
了解JavaScript表单操作和表单域
May 27 Javascript
javascript Keycode对照表
Oct 24 #Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 #Javascript
写入cookie的JavaScript代码库 cookieLibrary.js
Oct 24 #Javascript
js文件中调用js的实现方法小结
Oct 23 #Javascript
struts2 jquery 打造无限层次的树
Oct 23 #Javascript
jquery 插件开发方法小结
Oct 23 #Javascript
jquery 屏蔽一个区域内的所有元素,禁止输入
Oct 22 #Javascript
You might like
用PHP来写记数器(详细介绍)
2006/10/09 PHP
PHP获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
php zip文件解压类代码
2009/12/02 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
两个php日期控制类实例
2014/12/09 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
javascript里的条件判断
2007/02/27 Javascript
javascript中的有名函数和无名函数
2007/10/17 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
2017/09/29 NodeJs
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
Python只用40行代码编写的计算器实例
2017/05/10 Python
python如何修改装饰器中参数
2018/03/20 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
图书室管理制度
2014/01/19 职场文书
初三物理教学反思
2014/01/21 职场文书
推荐信模板
2014/05/09 职场文书
试用期自我评价范文
2015/03/10 职场文书
困难补助申请报告
2015/05/19 职场文书
2015年助理政工师工作总结
2015/05/26 职场文书
2016十一国庆节感言
2015/12/09 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
python分分钟绘制精美地图海报
2022/02/15 Python
Elasticsearch 数据类型及管理
2022/04/19 Python