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 相关文章推荐
js类 from qq
Nov 13 Javascript
jquery HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
Firefox+FireBug使JQuery的学习更加轻松愉快
Jan 01 Javascript
EXT中xtype的含义分析
Jan 07 Javascript
JavaScript OOP面向对象介绍
Dec 02 Javascript
JavaScript基本的输出和嵌入式写法教程
Oct 20 Javascript
window.open不被拦截的简单实现代码(推荐)
Aug 04 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
微信小程序授权登录及解密unionId出错的方法
Sep 26 Javascript
vue实现自定义H5视频播放器的方法步骤
Jul 01 Javascript
Layui给switch添加响应事件的例子
Sep 03 Javascript
vue中使用vue-pdf的方法详解
Sep 05 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
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
解析PHPExcel使用的常用说明以及把PHPExcel整合进CI框架的介绍
2013/06/24 PHP
php读取3389的脚本
2014/05/06 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
node.js中的fs.fchmodSync方法使用说明
2014/12/16 Javascript
JS实现仿中关村论坛评分后弹出提示效果的方法
2015/02/23 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
python 实时遍历日志文件
2016/04/12 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
Flask框架搭建虚拟环境的步骤分析
2019/12/21 Python
详解Python实现进度条的4种方式
2020/01/15 Python
Python count函数使用方法实例解析
2020/03/23 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
英国发展最快的在线超市之一:Click Marketplace
2021/02/15 全球购物
团员个人的自我评价
2013/12/02 职场文书
办公室打字员岗位职责
2014/04/16 职场文书
地球一小时宣传标语
2014/06/24 职场文书
机电系毕业生求职信
2014/07/11 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
地陪导游欢迎词
2015/01/26 职场文书
四大名著读书笔记
2015/06/25 职场文书
python小程序之飘落的银杏
2021/04/17 Python
JVM之方法返回地址详解
2022/02/28 Java/Android