原文出处:https://blog.csdn.net/qqliang1314/article/details/41850919 (建义阅读原文)
效果如下:
功能描述:单击页面使单元格td变成可编辑状态,输入内容后,当单元格失去焦点时,保存输入的内容。
点击增加行,在table的末尾增加一行;点击删除行,删除table中最末尾的一行。
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<html xmlns="http://www.w3.org/1999/xhtml">
-
<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,......);
-
* Create by Senty at 2008-04-12
-
**/
-
//设置多个表格可编辑
-
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>