如何用JS+HTML写个简单的可编辑表格
Admin 2022-10-21 群英技术资讯 474 次浏览
功能描述:单击页面使单元格td变成可编辑状态,输入内容后,当单元格失去焦点时,保存输入的内容。
点击增加行,在table的末尾增加一行;点击删除行,删除table中最末尾的一行。
?< html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" /> < title >编辑表格数据</ title > < style type = "text/css" > <!-- body,div,p,ul,li,font,span,td,th{ font-size:10pt; line-height:155%; } table{ border-top-width: 1px; border-right-width: 1px; border-bottom-width: 0px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: none; border-left-style: solid; border-top-color: #CCCCCC; border-right-color: #CCCCCC; border-bottom-color: #CCCCCC; border-left-color: #CCCCCC; } td{ border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #CCCCCC; } .EditCell_TextBox { width: 90%; border:1px solid #0099CC; } .EditCell_DropDownList { width: 90%; } --> </ style > < script > /** * JS实现可编辑的表格 * 用法:EditTables(tb1,tb2,tb2,......); **/ //设置多个表格可编辑 function EditTables(){ for(var i=0;i< arguments.length ;i++){ SetTableCanEdit(arguments[i]); } } //设置表格是可编辑的 function SetTableCanEdit(table){ for(var i = 1 ; i<table.rows.length;i++){ SetRowCanEdit(table.rows[i]); } } function SetRowCanEdit(row){ for(var j = 0 ;j<row.cells.length; j++){ //如果当前单元格指定了编辑类型,则表示允许编辑 var editType = row .cells[j].getAttribute("EditType"); if(!editType){ //如果当前单元格没有指定,则查看当前列是否指定 editType = row .parentNode.rows[0].cells[j].getAttribute("EditType"); } if(editType){ row.cells[j] .onclick = function (){ EditCell(this); } } } } //设置指定单元格可编辑 function EditCell(element, editType){ var editType = element .getAttribute("EditType"); if(!editType){ //如果当前单元格没有指定,则查看当前列是否指定 editType = element .parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("EditType"); } switch(editType){ case "TextBox": CreateTextBox(element, element.innerHTML); break; case "DropDownList": CreateDropDownList(element); break; default: break; } } //为单元格创建可编辑输入框 function CreateTextBox(element, value){ //检查编辑状态,如果已经是编辑状态,跳过 var editState = element .getAttribute("EditState"); if(editState != "true"){ //创建文本框 var textBox = document .createElement("INPUT"); textBox.type = "text" ; textBox.className = "EditCell_TextBox" ; //设置文本框当前值 if(!value){ value = element .getAttribute("Value"); } textBox.value = value; //设置文本框的失去焦点事件 textBox.onblur = function (){ CancelEditCell(this.parentNode, this.value); } //向当前单元格添加文本框 ClearChild(element); element.appendChild(textBox); textBox.focus(); textBox.select(); //改变状态变量 element.setAttribute("EditState", "true"); element.parentNode.parentNode.setAttribute("CurrentRow", element.parentNode.rowIndex); } } //为单元格创建选择框 function CreateDropDownList(element, value){ //检查编辑状态,如果已经是编辑状态,跳过 var editState = element .getAttribute("EditState"); if(editState != "true"){ //创建下接框 var downList = document .createElement("Select"); downList.className = "EditCell_DropDownList" ; //添加列表项 var items = element .getAttribute("DataItems"); if(!items){ items = element .parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("DataItems"); } if(items){ items = eval ("[" + items + "]"); for(var i = 0 ; i<items.length; i++){ var oOption = document .createElement("OPTION"); oOption.text = items [i].text; oOption.value = items [i].value; downList.options.add(oOption); } } //设置列表当前值 if(!value){ value = element .getAttribute("Value"); } downList.value = value; //设置创建下接框的失去焦点事件 downList.onblur = function (){ CancelEditCell(this.parentNode, this.value, this.options[this.selectedIndex].text); } //向当前单元格添加创建下接框 ClearChild(element); element.appendChild(downList); downList.focus(); //记录状态的改变 element.setAttribute("EditState", "true"); element.parentNode.parentNode.setAttribute("LastEditRow", element.parentNode.rowIndex); } } //取消单元格编辑状态 function CancelEditCell(element, value, text){ element.setAttribute("Value", value); if(text){ element.innerHTML = text ; }else{ element.innerHTML = value ; } element.setAttribute("EditState", "false"); //检查是否有公式计算 CheckExpression(element.parentNode); } //清空指定对象的所有字节点 function ClearChild(element){ element.innerHTML = "" ; } //添加行 function AddRow(table, index){ var lastRow = table .rows[table.rows.length-1]; var newRow = lastRow .cloneNode(true); //计算新增加行的序号,需要引入jquery 的jar包 var startIndex = $.inArray(lastRow,table.rows); var endIndex = table .rows; table.tBodies[0].appendChild(newRow); newRow.cells[0] .innerHTML = endIndex -startIndex; SetRowCanEdit(newRow); return newRow; } //删除行 function DeleteRow(table, index){ for(var i = table .rows.length - 1; i>0;i--){ var chkOrder = table.rows[i].cells[0].firstChild; if(chkOrder){ if(chkOrder.type = "CHECKBOX"){ if(chkOrder.checked){ //执行删除 table.deleteRow(i); } } } } } //提取表格的值,JSON格式 function GetTableData(table){ var tableData = new Array(); alert("行数:" + table.rows.length); for(var i=1; i< table.rows.length ;i++){ tableData.push(GetRowData(tabProduct.rows[i])); } return tableData; } //提取指定行的数据,JSON格式 function GetRowData(row){ var rowData = {}; for(var j = 0 ;j<row.cells.length; j++){ name = row .parentNode.rows[0].cells[j].getAttribute("Name"); if(name){ var value = row .cells[j].getAttribute("Value"); if(!value){ value = row .cells[j].innerHTML; } rowData[name] = value; } } //alert("ProductName:" + rowData.ProductName); //或者这样:alert("ProductName:" + rowData["ProductName"]); return rowData; } //检查当前数据行中需要运行的字段 function CheckExpression(row){ for(var j = 0 ;j<row.cells.length; j++){ expn = row .parentNode.rows[0].cells[j].getAttribute("Expression"); //如指定了公式则要求计算 if(expn){ var result = Expression (row,expn); var format = row .parentNode.rows[0].cells[j].getAttribute("Format"); if(format){ //如指定了格式,进行字值格式化 row.cells[j] .innerHTML = formatNumber (Expression(row,expn), format); }else{ row.cells[j] .innerHTML = Expression (row,expn); } } } } //计算需要运算的字段 function Expression(row, expn){ var rowData = GetRowData (row); //循环代值计算 for(var j = 0 ;j<row.cells.length; j++){ name = row .parentNode.rows[0].cells[j].getAttribute("Name"); if(name){ var reg = new RegExp(name, "i"); expn = expn.replace(reg, rowData[name].replace(/\,/g, "")); } } return eval(expn); } /// /** * 格式化数字显示方式 * 用法 * formatNumber(12345.999,'#,##0.00'); * formatNumber(12345.999,'#,##0.##'); * formatNumber(123,'000000'); * @param num * @param pattern */ /* 以下是范例 formatNumber('','')=0 formatNumber(123456789012.129,null)=123456789012 formatNumber(null,null)=0 formatNumber(123456789012.129,'#,##0.00')=123,456,789,012.12 formatNumber(123456789012.129,'#,##0.##')=123,456,789,012.12 formatNumber(123456789012.129,'#0.00')=123,456,789,012.12 formatNumber(123456789012.129,'#0.##')=123,456,789,012.12 formatNumber(12.129,'0.00')=12.12 formatNumber(12.129,'0.##')=12.12 formatNumber(12,'00000')=00012 formatNumber(12,'#.##')=12 formatNumber(12,'#.00')=12.00 formatNumber(0,'#.##')=0 */ function formatNumber(num,pattern){ var strarr = num ?num.toString().split('.'):['0']; var fmtarr = pattern ?pattern.split('.'):['']; var retstr = '' ; // 整数部分 var str = strarr [0]; var fmt = fmtarr [0]; var i = str .length-1; var comma = false ; for(var f = fmt .length-1;f>=0;f--){ switch(fmt.substr(f,1)){ case '#': if(i>=0 ) retstr = str.substr(i--,1) + retstr; break; case '0': if(i>=0) retstr = str.substr(i--,1) + retstr; else retstr = '0' + retstr; break; case ',': comma = true; retstr=','+retstr; break; } } if(i>=0){ if(comma){ var l = str.length; for(;i>=0;i--){ retstr = str.substr(i,1) + retstr; if(i>0 && ((l-i)%3)==0) retstr = ',' + retstr; } } else retstr = str.substr(0,i+1) + retstr; } retstr = retstr+'.'; // 处理小数部分 str=strarr.length>1?strarr[1]:''; fmt=fmtarr.length>1?fmtarr[1]:''; i=0; for(var f=0;f< fmt.length ;f++){ switch(fmt.substr(f,1)){ case '#': if(i<str.length) retstr+=str.substr(i++,1); break; case '0': if(i<str.length) retstr+= str.substr(i++,1); else retstr+='0'; break; } } return retstr.replace(/^,+/,'').replace(/\.$/,''); } </script> </ head > < body > < form id = "form1" name = "form1" method = "post" action = "" > < h3 >可编辑的表格</ h3 > < table width = "698" border = "0" cellpadding = "0" cellspacing = "0" id = "tabProduct" > < tr > < td width = "32" align = "center" bgcolor = "#EFEFEF" Name = "Num" >< input type = "checkbox" name = "checkbox" value = "checkbox" /></ td > < td width = "186" bgcolor = "#EFEFEF" Name = "Num" EditType = "TextBox" >序号</ td > < 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 > < td width = "103" bgcolor = "#EFEFEF" Name = "Amount" EditType = "TextBox" >数量</ td > < td width = "103" bgcolor = "#EFEFEF" Name = "Price" EditType = "TextBox" >单价</ td > < td width = "120" bgcolor = "#EFEFEF" Name = "SumMoney" Expression = "Amount*Price" Format = "#,###.00" >合计</ td > </ tr > < tr > < td align = "center" bgcolor = "#FFFFFF" >< input type = "checkbox" name = "checkbox2" value = "checkbox" /></ td > < td bgcolor = "#FFFFFF" >1</ td > < td bgcolor = "#FFFFFF" Value = "c" >C</ td > < td bgcolor = "#FFFFFF" >0</ td > < td bgcolor = "#FFFFFF" >0</ td > < td bgcolor = "#FFFFFF" >0</ td > </ tr > < tr > < td align = "center" bgcolor = "#FFFFFF" >< input type = "checkbox" name = "checkbox22" value = "checkbox" /></ td > < td bgcolor = "#FFFFFF" >2</ td > < td bgcolor = "#FFFFFF" Value = "d" >D</ td > < td bgcolor = "#FFFFFF" >0</ td > < td bgcolor = "#FFFFFF" >0</ td > < td bgcolor = "#FFFFFF" >0</ td > </ tr > </ table > < br /> < input type = "button" name = "Submit" value = "新增" onclick = "AddRow(document.getElementById('tabProduct'),1)" /> < input type = "button" name = "Submit2" value = "删除" onclick = "DeleteRow(document.getElementById('tabProduct'),1)" /> < input type = "button" name = "Submit22" value = "重置" onclick = "window.location.reload()" /> < input type = "submit" name = "Submit3" value = "提交" onclick = "GetTableData(document.getElementById('tabProduct'));return false;" /> </ form > < script language = "javascript" src = "GridEdit.js" ></ script > < script language = "javascript" > var tabProduct = document.getElementById("tabProduct"); // 设置表格可编辑 // 可一次设置多个,例如:EditTables(tb1,tb2,tb2,......) EditTables(tabProduct); </ script > </ body > </ html > |
效果如下:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
React是用于构建用户界面的JavaScript库,本文主要介绍了如何创建自己的第一个React页面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要介绍了JavaScript队列数据结构详解,队列是一种先进先出的数据结构,队列中允许两种基础操作,也就是插入和删除,也就是入队和出队
这篇文章主要为大家详细介绍了node+express实现分页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章主要介绍了如何在JavaScript中使用localStorage,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了vue element和nuxt的使用技巧分享,帮助大家更好的理解和使用vue框架,感兴趣的朋友可以了解下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008