html+javascript实现可编辑表格

 功能描述:单击页面使单元格td变成可编辑状态,输入内容后,当单元格失去焦点时,保存输入的内容。
点击增加行,在table的末尾增加一行;点击删除行,删除table中最末尾的一行。
     
[html]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">    
  2. <html xmlns="http://www.w3.org/1999/xhtml">    
  3. <head>    
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    
  5. <title>编辑表格数据</title>    
  6. <style type="text/css">    
  7. <!--    
  8. body,div,p,ul,li,font,span,td,th{    
  9. font-size:10pt;    
  10. line-height:155%;    
  11. }    
  12. table{    
  13. border-top-width: 1px;    
  14. border-right-width: 1px;    
  15. border-bottom-width: 0px;    
  16. border-left-width: 1px;    
  17. border-top-style: solid;    
  18. border-right-style: solid;    
  19. border-bottom-style: none;    
  20. border-left-style: solid;    
  21. border-top-color: #CCCCCC;    
  22. border-right-color: #CCCCCC;    
  23. border-bottom-color: #CCCCCC;    
  24. border-left-color: #CCCCCC;    
  25. }    
  26. td{    
  27. border-bottom-width: 1px;    
  28. border-bottom-style: solid;    
  29. border-bottom-color: #CCCCCC;    
  30. }    
  31. .EditCell_TextBox {    
  32. width: 90%;    
  33. border:1px solid #0099CC;    
  34. }    
  35. .EditCell_DropDownList {    
  36. width: 90%;    
  37. }    
  38. -->    
  39. </style>    
  40. <script>  
  41.     /**   
  42. * JS实现可编辑的表格     
  43. * 用法:EditTables(tb1,tb2,tb2,......);   
  44. * Create by Senty at 2008-04-12   
  45. **/    
  46.     
  47. //设置多个表格可编辑    
  48. function EditTables(){    
  49. for(var i=0;i<arguments.length;i++){    
  50.    SetTableCanEdit(arguments[i]);    
  51. }    
  52. }    
  53.     
  54. //设置表格是可编辑的    
  55. function SetTableCanEdit(table){    
  56. for(var i=1; i<table.rows.length;i++){    
  57.    SetRowCanEdit(table.rows[i]);    
  58. }    
  59. }    
  60.     
  61. function SetRowCanEdit(row){    
  62. for(var j=0;j<row.cells.length; j++){    
  63.     
  64.    //如果当前单元格指定了编辑类型,则表示允许编辑    
  65.    var editType = row.cells[j].getAttribute("EditType");    
  66.    if(!editType){    
  67.     //如果当前单元格没有指定,则查看当前列是否指定    
  68.     editType = row.parentNode.rows[0].cells[j].getAttribute("EditType");    
  69.    }    
  70.    if(editType){    
  71.     row.cells[j].onclick = function (){    
  72.      EditCell(this);    
  73.     }    
  74.    }    
  75. }    
  76.     
  77. }    
  78.     
  79. //设置指定单元格可编辑    
  80. function EditCell(element, editType){    
  81.     
  82. var editType = element.getAttribute("EditType");    
  83. if(!editType){    
  84.    //如果当前单元格没有指定,则查看当前列是否指定    
  85.    editType = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("EditType");    
  86. }    
  87.     
  88. switch(editType){    
  89.    case "TextBox":    
  90.     CreateTextBox(element, element.innerHTML);    
  91.     break;    
  92.    case "DropDownList":    
  93.     CreateDropDownList(element);    
  94.     break;    
  95.    default:    
  96.     break;    
  97. }    
  98. }    
  99.     
  100. //为单元格创建可编辑输入框    
  101. function CreateTextBox(element, value){    
  102. //检查编辑状态,如果已经是编辑状态,跳过    
  103. var editState = element.getAttribute("EditState");    
  104. if(editState != "true"){    
  105.    //创建文本框    
  106.    var textBox = document.createElement("INPUT");    
  107.    textBox.type = "text";    
  108.    textBox.className="EditCell_TextBox";    
  109.       
  110.       
  111.    //设置文本框当前值    
  112.    if(!value){    
  113.     value = element.getAttribute("Value");    
  114.    }      
  115.    textBox.value = value;    
  116.       
  117.    //设置文本框的失去焦点事件    
  118.    textBox.onblur = function (){    
  119.     CancelEditCell(this.parentNode, this.value);    
  120.    }    
  121.    //向当前单元格添加文本框    
  122.    ClearChild(element);    
  123.    element.appendChild(textBox);    
  124.    textBox.focus();    
  125.    textBox.select();    
  126.       
  127.    //改变状态变量    
  128.    element.setAttribute("EditState", "true");    
  129.    element.parentNode.parentNode.setAttribute("CurrentRow", element.parentNode.rowIndex);    
  130. }    
  131.     
  132. }    
  133.     
  134.     
  135. //为单元格创建选择框    
  136. function CreateDropDownList(element, value){    
  137. //检查编辑状态,如果已经是编辑状态,跳过    
  138. var editState = element.getAttribute("EditState");    
  139. if(editState != "true"){    
  140.    //创建下接框    
  141.    var downList = document.createElement("Select");    
  142.    downList.className="EditCell_DropDownList";    
  143.       
  144.    //添加列表项    
  145.    var items = element.getAttribute("DataItems");    
  146.    if(!items){    
  147.     items = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("DataItems");    
  148.    }    
  149.       
  150.    if(items){    
  151.     items = eval("[" + items + "]");    
  152.     for(var i=0; i<items.length; i++){    
  153.      var oOption = document.createElement("OPTION");    
  154.      oOption.text = items[i].text;    
  155.      oOption.value = items[i].value;    
  156.      downList.options.add(oOption);    
  157.     }    
  158.    }    
  159.       
  160.    //设置列表当前值    
  161.    if(!value){    
  162.     value = element.getAttribute("Value");    
  163.    }    
  164.    downList.value = value;    
  165.     
  166.    //设置创建下接框的失去焦点事件    
  167.    downList.onblur = function (){    
  168.     CancelEditCell(this.parentNode, this.value, this.options[this.selectedIndex].text);    
  169.    }    
  170.       
  171.    //向当前单元格添加创建下接框    
  172.    ClearChild(element);    
  173.    element.appendChild(downList);    
  174.    downList.focus();    
  175.       
  176.    //记录状态的改变    
  177.    element.setAttribute("EditState", "true");    
  178.    element.parentNode.parentNode.setAttribute("LastEditRow", element.parentNode.rowIndex);    
  179. }    
  180.     
  181. }    
  182.     
  183.     
  184. //取消单元格编辑状态    
  185. function CancelEditCell(element, value, text){    
  186. element.setAttribute("Value", value);    
  187. if(text){    
  188.    element.innerHTML = text;    
  189. }else{    
  190.    element.innerHTML = value;    
  191. }    
  192. element.setAttribute("EditState", "false");    
  193.     
  194. //检查是否有公式计算    
  195. CheckExpression(element.parentNode);    
  196. }    
  197.     
  198. //清空指定对象的所有字节点    
  199. function ClearChild(element){    
  200. element.innerHTML = "";    
  201. }    
  202.     
  203. //添加行    
  204. function AddRow(table, index){    
  205. var lastRow = table.rows[table.rows.length-1];    
  206. var newRow = lastRow.cloneNode(true);    
  207. //计算新增加行的序号,需要引入jquery 的jar包  
  208. var startIndex = $.inArray(lastRow,table.rows);  
  209. var endIndex = table.rows;   
  210. nbsp;table.tBodies[0].appendChild(newRow);    
  211. newRow.cells[0].innerHTML=endIndex-startIndex;  
  212. SetRowCanEdit(newRow);    
  213. return newRow;    
  214.     
  215. }    
  216.     
  217.     
  218. //删除行    
  219. function DeleteRow(table, index){    
  220. for(var i=table.rows.length - 1; i>0;i--){    
  221.    var chkOrder = table.rows[i].cells[0].firstChild;    
  222.    if(chkOrder){    
  223.     if(chkOrder.type = "CHECKBOX"){    
  224.      if(chkOrder.checked){    
  225.       //执行删除    
  226.       table.deleteRow(i);    
  227.      }    
  228.     }    
  229.    }    
  230. }    
  231. }    
  232.     
  233. //提取表格的值,JSON格式    
  234. function GetTableData(table){    
  235. var tableData = new Array();    
  236. alert("行数:" + table.rows.length);    
  237. for(var i=1; i<table.rows.length;i++){    
  238.    tableData.push(GetRowData(tabProduct.rows[i]));    
  239. }    
  240.     
  241. return tableData;    
  242.     
  243. }    
  244. //提取指定行的数据,JSON格式    
  245. function GetRowData(row){    
  246. var rowData = {};    
  247. for(var j=0;j<row.cells.length; j++){    
  248.    name = row.parentNode.rows[0].cells[j].getAttribute("Name");    
  249.    if(name){    
  250.     var value = row.cells[j].getAttribute("Value");    
  251.     if(!value){    
  252.      value = row.cells[j].innerHTML;    
  253.     }    
  254.        
  255.     rowData[name] = value;    
  256.    }    
  257. }    
  258. //alert("ProductName:" + rowData.ProductName);    
  259. //或者这样:alert("ProductName:" + rowData["ProductName"]);    
  260. return rowData;    
  261.     
  262. }    
  263.     
  264. //检查当前数据行中需要运行的字段    
  265. function CheckExpression(row){    
  266. for(var j=0;j<row.cells.length; j++){    
  267.    expn = row.parentNode.rows[0].cells[j].getAttribute("Expression");    
  268.    //如指定了公式则要求计算    
  269.    if(expn){    
  270.     var result = Expression(row,expn);    
  271.     var format = row.parentNode.rows[0].cells[j].getAttribute("Format");    
  272.     if(format){    
  273.      //如指定了格式,进行字值格式化    
  274.      row.cells[j].innerHTML = formatNumber(Expression(row,expn), format);    
  275.     }else{    
  276.      row.cells[j].innerHTML = Expression(row,expn);    
  277.     }    
  278.    }    
  279.       
  280. }    
  281. }    
  282.     
  283. //计算需要运算的字段    
  284. function Expression(row, expn){    
  285. var rowData = GetRowData(row);    
  286. //循环代值计算    
  287. for(var j=0;j<row.cells.length; j++){    
  288.    name = row.parentNode.rows[0].cells[j].getAttribute("Name");    
  289.    if(name){    
  290.     var reg = new RegExp(name, "i");    
  291.     expn = expn.replace(reg, rowData[name].replace(/\,/g, ""));    
  292.    }    
  293. }    
  294. return eval(expn);    
  295. }    
  296.     
  297. ///    
  298. /**   
  299. * 格式化数字显示方式     
  300. * 用法   
  301. * formatNumber(12345.999,'#,##0.00');   
  302. * formatNumber(12345.999,'#,##0.##');   
  303. * formatNumber(123,'000000');   
  304. * @param num   
  305. * @param pattern   
  306. */    
  307. /* 以下是范例   
  308. formatNumber('','')=0   
  309. formatNumber(123456789012.129,null)=123456789012   
  310. formatNumber(null,null)=0   
  311. formatNumber(123456789012.129,'#,##0.00')=123,456,789,012.12   
  312. formatNumber(123456789012.129,'#,##0.##')=123,456,789,012.12   
  313. formatNumber(123456789012.129,'#0.00')=123,456,789,012.12   
  314. formatNumber(123456789012.129,'#0.##')=123,456,789,012.12   
  315. formatNumber(12.129,'0.00')=12.12   
  316. formatNumber(12.129,'0.##')=12.12   
  317. formatNumber(12,'00000')=00012   
  318. formatNumber(12,'#.##')=12   
  319. formatNumber(12,'#.00')=12.00   
  320. formatNumber(0,'#.##')=0   
  321. */    
  322. function formatNumber(num,pattern){      
  323. var strarr = num?num.toString().split('.'):['0'];      
  324. var fmtarr = pattern?pattern.split('.'):[''];      
  325. var retstr='';      
  326.       
  327. // 整数部分      
  328. var str = strarr[0];      
  329. var fmt = fmtarr[0];      
  330. var i = str.length-1;        
  331. var comma = false;      
  332. for(var f=fmt.length-1;f>=0;f--){      
  333.     switch(fmt.substr(f,1)){      
  334.       case '#':      
  335.         if(i>=0 ) retstr = str.substr(i--,1) + retstr;      
  336.         break;      
  337.       case '0':      
  338.         if(i>=0) retstr = str.substr(i--,1) + retstr;      
  339.         else retstr = '0' + retstr;      
  340.         break;      
  341.       case ',':      
  342.         comma = true;      
  343.         retstr=','+retstr;      
  344.         break;      
  345.     }      
  346. }      
  347. if(i>=0){      
  348.     if(comma){      
  349.       var l = str.length;      
  350.       for(;i>=0;i--){      
  351.         retstr = str.substr(i,1) + retstr;      
  352.         if(i>0 && ((l-i)%3)==0) retstr = ',' + retstr;       
  353.       }      
  354.     }      
  355.     else retstr = str.substr(0,i+1) + retstr;      
  356. }      
  357.       
  358. retstr = retstr+'.';      
  359. // 处理小数部分      
  360. str=strarr.length>1?strarr[1]:'';      
  361. fmt=fmtarr.length>1?fmtarr[1]:'';      
  362. i=0;      
  363. for(var f=0;f<fmt.length;f++){      
  364.     switch(fmt.substr(f,1)){      
  365.       case '#':      
  366.         if(i<str.length) retstr+=str.substr(i++,1);      
  367.         break;      
  368.       case '0':      
  369.         if(i<str.length) retstr+= str.substr(i++,1);      
  370.         else retstr+='0';      
  371.         break;      
  372.     }      
  373. }      
  374. return retstr.replace(/^,+/,'').replace(/\.$/,'');      
  375. }    
  376. </script>  
  377. </head>    
  378.     
  379. <body>    
  380. <form id="form1" name="form1" method="post" action="">    
  381. <h3>可编辑的表格</h3>    
  382. <table width="698" border="0" cellpadding="0" cellspacing="0" id="tabProduct">    
  383.     <tr>    
  384.       <td width="32" align="center" bgcolor="#EFEFEF" Name="Num"><input type="checkbox" name="checkbox" value="checkbox" /></td>    
  385.       <td width="186" bgcolor="#EFEFEF" Name="Num" EditType="TextBox">序号</td>    
  386.       <td width="152" bgcolor="#EFEFEF" Name="ProductName" EditType="DropDownList" DataItems="{text:'A',value:'a'},{text:'B',value:'b'},{text:'C',value:'c'},{text:'D',value:'d'}">商品名称</td>    
  387.       <td width="103" bgcolor="#EFEFEF" Name="Amount" EditType="TextBox">数量</td>    
  388.       <td width="103" bgcolor="#EFEFEF" Name="Price" EditType="TextBox">单价</td>    
  389.       <td width="120" bgcolor="#EFEFEF" Name="SumMoney" Expression="Amount*Price" Format="#,###.00">合计</td>    
  390.     </tr>    
  391.     <tr>    
  392.       <td align="center" bgcolor="#FFFFFF"><input type="checkbox" name="checkbox2" value="checkbox" /></td>    
  393.       <td bgcolor="#FFFFFF">1</td>    
  394.       <td bgcolor="#FFFFFF" Value="c">C</td>    
  395.       <td bgcolor="#FFFFFF">0</td>    
  396.       <td bgcolor="#FFFFFF">0</td>    
  397.       <td bgcolor="#FFFFFF">0</td>    
  398.     </tr>    
  399.     <tr>    
  400.       <td align="center" bgcolor="#FFFFFF"><input type="checkbox" name="checkbox22" value="checkbox" /></td>    
  401.       <td bgcolor="#FFFFFF">2</td>    
  402.       <td bgcolor="#FFFFFF" Value="d">D</td>    
  403.       <td bgcolor="#FFFFFF">0</td>    
  404.       <td bgcolor="#FFFFFF">0</td>    
  405.       <td bgcolor="#FFFFFF">0</td>    
  406.     </tr>    
  407. </table>    
  408.     
  409. <br />    
  410. <input type="button" name="Submit" value="新增" onclick="AddRow(document.getElementById('tabProduct'),1)" />    
  411. <input type="button" name="Submit2" value="删除" onclick="DeleteRow(document.getElementById('tabProduct'),1)" />    
  412. <input type="button" name="Submit22" value="重置" onclick="window.location.reload()" />    
  413. <input type="submit" name="Submit3" value="提交" onclick="GetTableData(document.getElementById('tabProduct'));return false;" />    
  414. </form>    
  415.     
  416. <script language="javascript" src="GridEdit.js"></script>    
  417. <script language="javascript">    
  418. var tabProduct = document.getElementById("tabProduct");    
  419.     
  420. // 设置表格可编辑    
  421. // 可一次设置多个,例如:EditTables(tb1,tb2,tb2,......)    
  422. EditTables(tabProduct);    
  423.     
  424.     
  425. </script>    
  426. </body>    
  427. </html>    

效果如下:
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值