用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 相关文章推荐
jQuery Ajax之$.get()方法和$.post()方法
Oct 12 Javascript
一步一步制作jquery插件Tabs实现过程
Jul 06 Javascript
JQuery与JSon实现的无刷新分页代码
Sep 13 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
Sep 12 Javascript
document.execCommand()的用法小结
Jan 08 Javascript
JS的location.href跳出框架打开新页面的方法
Sep 04 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
Feb 04 Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 Javascript
解析微信JS-SDK配置授权,实现分享接口
Dec 09 Javascript
Bootstrap模态框案例解析
Mar 05 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
Sep 05 Javascript
Vue SPA 初次进入加载动画实现代码
Nov 14 Javascript
可以用鼠标拖动的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
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
详解PHP的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
常用的javascript function代码
2008/05/23 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
js四舍五入数学函数round使用实例
2014/05/09 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
jquery控制表单输入框显示默认值的方法
2015/05/22 Javascript
浅谈javascript中的Function和Arguments
2016/08/30 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
JavaScript控制浏览器全屏显示简单示例
2018/07/05 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
Atom的python插件和常用插件说明
2018/07/08 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
关于tf.reverse_sequence()简述
2020/01/20 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
python中封包建立过程实例
2021/02/18 Python
五款漂亮的纯CSS3动画按钮的实例教程
2014/11/21 HTML / CSS
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
为您搜罗全球潮流時尚品牌:HBX
2019/12/04 全球购物
有关环保的标语
2014/06/13 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
贯彻落实“八项规定”思想汇报
2014/09/13 职场文书
教师考核评语大全
2014/12/31 职场文书
建国大业观后感800字
2015/06/01 职场文书
2016年公司新年寄语
2015/08/17 职场文书
离婚协议书范文2016
2016/03/18 职场文书
Redisson实现Redis分布式锁的几种方式
2021/08/07 Redis