JS实现可编辑的表格

来源:互联网 发布:淘宝详情视频怎么制作 编辑:程序博客网 时间:2024/06/05 00:44

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

转载出处:http://blog.csdn.net/easybjy/article/details/7696498

0 0