用Js实现的动态增加表格示例自己写的


Posted in Javascript onOctober 21, 2013
function addEvent (o,c,h){ 
if(o.attachEvent){ 
o.attachEvent('on'+c,h); 
}else{ 
o.addEventListener(c,h,false); 
} 
return true;} 
var selectRow;//页面级js变量,用来存被选中的行,好在弹出窗口中对该行赋值 
function addnode() 
{ 
var table=document.getElementById("Dy_table"); 
var tr=table.insertRow(); 
var cell0=tr.insertCell(); 
var cell1=tr.insertCell(); 
var cell2=tr.insertCell(); 
var cell3=tr.insertCell(); 
var cell4=tr.insertCell(); 
var cell5=tr.insertCell(); 
var cell6=tr.insertCell(); 
var cell7=tr.insertCell(); 
var cell8=tr.insertCell(); 
var cell9=tr.insertCell(); 
var hidden1=document.createElement("<input name='Dy_hd_cpdm' onpropertychange='textChange(this)' type='hidden' >"); 
var hidden2=document.createElement("<input name='Dy_hd_sx' type='hidden' >"); 
var hidden3=document.createElement("<input name='Dy_hd_mxid' type='hidden' >"); 
var hidden4=document.createElement("<input name='Dy_hd_rowState' type='hidden' value='1'>");//行状态 
var hidden5=document.createElement("<input name='Dy_hd_dj' type='hidden' value='0'>");//隐藏单价 
var input1=document.createElement("<Input type='text' ondblclick='selectLj(this)' style='width:100px' name='Dy_text_ljh' >"); 
var input2=document.createElement("<Input type='text' style='width:100px' name='Dy_text_cpmc' >"); 
var input3=document.createElement("<Input type='text' onKeyPress='onlyNumberIn1(this)' style='width:40px' value='1' name='Dy_text_sl' >"); 
var input4=document.createElement("<Input type='text' onKeyPress='onlyNumberIn(this)' style='width:60px' name='Dy_text_dj' >"); 
var input5=document.createElement("<Input type='text' style='width:100px' name='Dy_text_sccj' >"); 
var input6=document.createElement("<select name='Dy_select_clly' >"); 
var input7=document.createElement("<Input type='text' readonly='true' style='width:40px' name='Dy_text_glf' >"); 
var input8=document.createElement("<Input type='text' readonly='true' style='width:60px' name='Dy_text_je' >"); 
var input9=document.createElement("<Input type='button' name='del' value='删 除' class='input-button' onclick='delnode1(this)' >") 
var oOption1=document.createElement("option"); 
var oOption2=document.createElement("option"); 
var oOption3=document.createElement("option"); 
var oOption4=document.createElement("option"); 
input6.options.add(oOption1); 
input6.options.add(oOption2); 
input6.options.add(oOption3); 
input6.options.add(oOption4); 
oOption1.innerText="合同件"; 
oOption1.value="合同件"; 
oOption2.innerText="外购件"; 
oOption2.value="外购件"; 
oOption3.innerText="备件部"; 
oOption3.value="备件部"; 
oOption4.innerText="厂家供件"; 
oOption4.value="厂家供件"; 
var rowIndex; 
rowIndex = table.rows.length-2; 
var rowCount = table.rows[0].cells[0].getElementsByTagName("input")[2].value;//用户可见的行数 
cell0.innerText=parseInt(rowCount)+1; 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount)+1; 
hidden2.value = parseInt(table.rows[0].cells[0].getElementsByTagName("input")[1].value) + 1; 
table.rows[0].cells[0].getElementsByTagName("input")[1].value=hidden2.value; 
cell1.appendChild(input1); 
cell1.appendChild(hidden1);//产品代码 
cell1.appendChild(hidden2);//内部顺序 
cell1.appendChild(hidden3);//该行的Id,用来修改和删除 
cell1.appendChild(hidden4);//该行的状态 
cell2.appendChild(input2); 
cell3.appendChild(input3); 
cell4.appendChild(input4); 
cell4.appendChild(hidden5); 
cell5.appendChild(input5); 
cell6.appendChild(input6); 
cell9.appendChild(input9); 
cell8.appendChild(input8); 
cell7.appendChild(input7); 
var tt=function(obj) 
{ 
return function(){textChange(obj);} 
} 
var ttt=function(obj) 
{ 
return function(){selectChange(obj);} 
} 
addEvent(input1,"change",tt(input1)); 
addEvent(input2,"change",tt(input1)); 
addEvent(input3,"change",tt(input1)); 
addEvent(input4,"change",tt(input1)); 
addEvent(input5,"change",tt(input1)); 
addEvent(input6,"change",ttt(input6)); 
addEvent(input7,"change",tt(input1)); 
// addEvent(input8,"change",tt(input1)); 
} 
function delnode()//删除时的事件 
{ 
var table=document.getElementById("Dy_table"); 
var rowCount = table.rows[0].cells[0].getElementsByTagName("input")[2].value;//用户可见的行数 
var row;//保存最后一个可见的row 
for( var i=table.rows.length-1; i>=0 ;i--) 
{ 
if(table.rows[i].style.display!="none") 
{ 
row=table.rows[i]; 
break; 
} 
} 
var rowId=row.cells[1].getElementsByTagName("input")[3].value; 
if( rowCount > 1 ) 
{ 
if(rowId=="")//新增的行未写入数据库时,直接删除 
{ 
row.removeNode(true); 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount) - 1; 
} 
else//需要从数据库删除的,置上删除标记 
{ 
row.style.display="none"; 
row.cells[1].getElementsByTagName("input")[4].value = "2"; 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount-1); 
} 
} 
else 
{ 
if(rowId == "")//新增的行未写入数据库时,清空 
{ 
row.cells.item(1).getElementsByTagName("input")[0].value=""; 
row.cells.item(1).getElementsByTagName("input")[1].value=""; 
row.cells.item(2).getElementsByTagName("input")[0].value=""; 
row.cells.item(3).getElementsByTagName("input")[0].value="1"; 
row.cells.item(4).getElementsByTagName("input")[0].value=""; 
row.cells.item(7).getElementsByTagName("input")[0].value=""; 
row.cells.item(5).getElementsByTagName("input")[0].value=""; 
row.cells.item(6).getElementsByTagName("select")[0].selectedIndex=0; 
} 
else//需要从数据库删除的,置上删除标记 
{ 
row.style.display="none"; 
row.cells[1].getElementsByTagName("input")[4].value = "2"; 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount) - 1; 
addnode(); 
} 
} 
setClf(); 
} 
function delnode1(o)//删除时的事件 
{ 
var tr=o.parentElement.parentElement; 
var table=document.getElementById("Dy_table"); 
var rowCount = table.rows[0].cells[0].getElementsByTagName("input")[2].value;//用户可见的行数 
var rowId=tr.cells[1].getElementsByTagName("input")[3].value; 
if( rowCount > 1 ) 
{ 
if(rowId=="")//新增的行未写入数据库时,直接删除 
{ 
tr.removeNode(true); 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount) - 1; 
} 
else 
{ 
tr.style.display="none"; 
tr.cells[1].getElementsByTagName("input")[4].value = "2"; 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount-1); 
} 
} 
else 
{ 
if(rowId=="")//新增的行未写入数据库时,直接清空 
{ 
tr.cells.item(1).getElementsByTagName("input")[0].value=""; 
tr.cells.item(1).getElementsByTagName("input")[1].value=""; 
tr.cells.item(2).getElementsByTagName("input")[0].value=""; 
tr.cells.item(3).getElementsByTagName("input")[0].value="1"; 
tr.cells.item(4).getElementsByTagName("input")[0].value=""; 
tr.cells.item(7).getElementsByTagName("input")[0].value=""; 
tr.cells.item(5).getElementsByTagName("input")[0].value=""; 
tr.cells.item(6).getElementsByTagName("select")[0].selectedIndex=0; 
} 
else//需要从数据库删除的,置上删除标记 
{ 
tr.style.display="none"; 
tr.cells[1].getElementsByTagName("input")[4].value = "2"; 
table.rows[0].cells[0].getElementsByTagName("input")[2].value = parseInt(rowCount) - 1; 
addnode(); 
} 
} 
//以下循环用于从中间删除时更新表格行号 
rowCount = table.rows[0].cells[0].getElementsByTagName("input")[2].value; 
for( var i= 1,p = 1; i < table.rows.length ;i++) 
{ 
if(table.rows[i].style.display!="none") 
{ 
table.rows[i].cells[0].innerText = p; 
p++; 
} 
} 
setClf(); 
} 
//修改时发生的事件 
function textChange(o) 
{ 
setClf(); 
var tr=o.parentElement.parentElement; 
var rowState = tr.cells[1].getElementsByTagName("input")[4].value; 
if( rowState == "1") 
return; 
else 
tr.cells[1].getElementsByTagName("input")[4].value = "3"; 
} 
//下拉框选项改变setClf()是计算金额的,这里面没有给出来 
function selectChange(o) 
{ 
var tr=o.parentElement.parentElement; 
var glf = tr.cells[7].getElementsByTagName("input")[0]; 
var dj = tr.cells[4].getElementsByTagName("input")[0]; 
var dj1 = tr.cells[4].getElementsByTagName("input")[1]; 
if( o.selectedIndex==0)//合同件 
{ 
glf.value='0.00'; 
dj.value=dj1.value; 
setClf(); 
return; 
} 
if( o.selectedIndex==1)//外购件 
{ 
glf.value='0.20'; 
dj.value=dj1.value; 
setClf(); 
return; 
} 
if( o.selectedIndex==2)//备件部 
{ 
glf.value='0.00'; 
dj.value=dj1.value; 
setClf(); 
return; 
} 
if( o.selectedIndex==3)//厂家供件 
{ 
glf.value='0.00'; 
dj.value='0.00'; 
dj.readOnly=true; 
setClf(); 
return; 
} 
} 
//提交前验证数据,保证没有重复的行 
function checkSameData() 
{ 
var table=document.getElementById("Dy_table"); 
// var rowCount = table.rows[0].cells[0].getElementsByTagName("input")[2].value;//用户可见的行数 
for( var i= 1; i < table.rows.length ;i++) 
{ 
if(table.rows[i].style.display == "none"||table.rows[i].cells[1].getElementsByTagName("input")[1].value=="") continue; 
for( var p= i + 1; p < table.rows.length ;p++) 
{ 
if(table.rows[p].style.display == "none") continue; 
if(table.rows[i].cells[1].getElementsByTagName("input")[1].value.replace(/\s+$/g,"") == 
table.rows[p].cells[1].getElementsByTagName("input")[1].value.replace(/\s+$/g,"")) 
{alert("零件部分存在重复的项,不能保存!");return false;} 
} 
} 
return true; 
} 
//零件窗口是否打开 
var dialogWin; 
function selectLj(o)//选零件 
{ 
if(dialogWin == null) 
{ 
selectRow = o.parentElement.parentElement;//将行赋值给全局变量 
dialogWin = window.showModelessDialog("../jddgl/Select_lj.aspx",window, 
"center:yes;dialogWidth:550px;dialogHeight:400px;help:no;status:no;"); 
} 
}

=======
前台页面
<table id="Dy_table" width="760" cellpadding="0" style=" border-top:solid 1px #9cf" class="tableStyle" cellspacing="0"> 
<tr> 
<td>序号<input id="pageState" name="pageState" type="hidden" value="0" /> <%--页面状态--%> 
<input id="pageRows" name="pageRows" type="hidden" value="1" /> <%--总行数,包括隐藏的--%> 
<asp:HiddenField ID="HF_tableRows" runat="server" Value="1" /> <%--用户可见行数--%> 
</td> 
<td>零件号</td> 
<td>零件名称</td> 
<td>数量</td> 
<td>单价</td> 
<td>生产厂家</td> 
<td>材料来源</td> 
<td>管理费</td> 
<td>合计</td> 
<td>操作</td> 
</tr> 
<tr><td>1</td><td><input name='Dy_text_ljh' style='width:100px' ondblclick='selectLj(this)' onchange='textChange(this)' type='text' /> 
<input name='Dy_hd_cpdm' type='hidden' onpropertychange='textChange(this)' title='产品代码' /> 
<input name='Dy_hd_sx' type='hidden' value='1' title='内部顺序' /> 
<input name='Dy_hd_mxid' type='hidden' value='' title='该行的Id,用来修改和删除' /> 
<input name='Dy_hd_rowState' type='hidden' value='1' title='该行的状态' /> 
</td><td><input name='Dy_text_cpmc' style='width:100px' onchange='textChange(this)' type='text' /></td> 
<td><input name='Dy_text_sl' value='1' onKeyPress='onlyNumberIn1(this)' onchange='textChange(this)' style='width:40px' type='text' /></td> 
<td><input name='Dy_text_dj' onKeyPress='onlyNumberIn(this)' onchange='textChange(this)' style='width:60px' type='text' /><input name='Dy_hd_dj' type='hidden' value='0'/></td> 
<td><input name='Dy_text_sccj' onchange='textChange(this)' style='width:100px' type='text' /></td> 
<td><select name='Dy_select_clly' onchange='selectChange(this)' ><option value='合同件'>合同件</option> 
<option value='外购件'>外购件</option><option value='备件部'>备件部</option> 
<option value='厂家供件'>厂家供件</option></select></td> 
<td><input name='Dy_text_glf' readonly='true' onchange='textChange(this)' style='width:40px' type='text' value='0.00' /></td> 
<td><input name='Dy_text_je' readonly='true' style='width:60px' type='text' /></td> 
<td><input name='del' type='button' value='删 除' class='input-button' onclick='delnode1(this)' /></td></tr> </table>

项目需要这种功能,前前后后用了几种办法,我觉得还是这种比较好(毕竟是我花了蛮多时间写的,呵呵),js不怎么熟练,希望有朋友能指点帮助改进和提高。失败的作品,不兼容FF,衰!
Javascript 相关文章推荐
js查找父节点的简单方法
Jun 28 Javascript
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
Oct 24 Javascript
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
JavaScript 高级篇之函数 (四)
Apr 07 Javascript
通过js动态操作table(新增,删除相关列信息)
May 23 Javascript
jquery easyui使用心得
Jul 07 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
Aug 25 Javascript
js实现用户输入的小写字母自动转大写字母的方法
Jan 21 Javascript
详解vuex commit保存数据技巧
Dec 25 Javascript
element-ui 时间选择器限制范围的实现(随动)
Jan 09 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
Dec 16 Javascript
vue+openlayers绘制省市边界线
Dec 24 Vue.js
可以用鼠标拖动的DIV实现思路及代码
Oct 21 #Javascript
JS中的this变量的使用介绍
Oct 21 #Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 #Javascript
js传参数受特殊字符影响错误的解决方法
Oct 21 #Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
Oct 21 #Javascript
JS操作Cookie写入和读取实例代码
Oct 20 #Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 #Javascript
You might like
PHP编程开发怎么提高编程效率 提高PHP编程技术
2015/11/09 PHP
PHP微信分享开发详解
2017/01/14 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
JavaScript将一个数组插入到另一个数组的方法
2015/03/19 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
基于JavaScript实现移动端TAB触屏切换效果
2015/10/20 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
微信小程序实现点赞、取消点赞功能
2018/11/02 Javascript
利用js-cookie实现前端设置缓存数据定时失效
2019/06/18 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
创建索引时需要注意的事项
2013/05/13 面试题
销售提升方案
2014/06/07 职场文书
党的生日活动方案
2014/08/15 职场文书
护士个人总结范文
2015/02/13 职场文书
学子宴致辞大全
2015/07/27 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫