JS可编辑的表格

来源:互联网 发布:lumia950xl安装linux 编辑:程序博客网 时间:2024/05/16 08:26



// 设置多个表格可编辑
function EditTables() {
 for ( var i = 0; i < arguments.length; i++) {
  SetTableCanEdit(arguments[i]);
 }
}
var _maxRow = 0;
// 设置表格是可编辑的
function SetTableCanEdit(table, maxRow) {
 _maxRow = maxRow;
 for ( var i = 1; i < table.rows.length; i++) {
  SetRowCanEdit(table.rows[i]);
 }
}

function SetRowCanEdit(row, bool) {
 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, bool);
   }
  }
 }

}

// 设置指定单元格可编辑
function EditCell(element, bool) {
 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;
 case "Date":
  CreateDate(element);
  break;
 case "Picker":
  CreatePicker(element,$(element).attr("value"),bool);
  break;
 case "Suffix":
  CreateSuffix(element, element.innerHtml);
  break;
 default:
  break;
 }
}
function CreateNo(element, value) {
 // 检查编辑状态,如果已经是编辑状态,跳过
 var t = element.parentNode.parentNode;
 var value = t.rows[t.rows.length - 1].cells[element.cellIndex].value + 1;
  // 创建文本框
  var textBox = document.createElement("INPUT");
  textBox.type = "text";
  textBox.value = value;
  // 向当前单元格添加文本框
  ClearChild(element);
  element.appendChild(textBox);
  // 改变状态变量
  t.setAttribute("CurrentRow", element.parentNode.rowIndex);

}
// 为单元格创建可编辑输入框
function CreateTextBox(element, value) {
 // 检查编辑状态,如果已经是编辑状态,跳过
 var editState = element.getAttribute("EditState");
 var required = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("required");
 if (editState != "true") {
  // 创建文本框
  var textBox = document.createElement("INPUT");
  textBox.type = "text";
  if(required == 'required') {
   textBox.className = "EditCell_TextBox easyui-validatebox";
   $(textBox).validatebox({required:true});
  }else {
   textBox.className = "EditCell_TextBox";
  }

  // 设置文本框当前值
  if (!value) {
   value = element.getAttribute("Value") == undefined ? '' : element.getAttribute("Value");
  }
  textBox.value = value;

  // 设置文本框的失去焦点事件
  textBox.onblur = function() {
   if($(this).validatebox('isValid')) {
    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);
 }

}

/**
 * 为单元格创建选择框@param element 元素
 *
 * @param value
 *            默认值
 * @param data
 *            数据来源
 */
function CreateDropDownList(element, value) {
 // 检查编辑状态,如果已经是编辑状态,跳过
 var editState = element.getAttribute("EditState");
 element.setAttribute('value', '');
 if (editState != "true") {
  if($(element).find('span').length > 0) {
   var combo = $(element).find('.combo');
   combo.show();
   combo.next().remove();
   return;
  }
  
 }

}
/**
 * 为单元格创建时间选择框@param element 元素
 *
 * @param value
 *            默认值
 * @param data
 *            数据来源
 */
function CreateDate(element, value) {
 // 检查编辑状态,如果已经是编辑状态,跳过
 var editState = element.getAttribute("EditState");
 element.setAttribute('value', '');
 if (editState != "true") {
  if($(element).find('span').length > 0) {
   var combo = $(element).find('.combo');
   combo.show();
   combo.next().remove();
   return;
  }
  // 创建文本框
  
 }
 
}

//为单元格创建选择框
function CreatePicker(element, value, bool) {
 // 检查编辑状态,如果已经是编辑状态,跳过
 var editState = element.getAttribute("EditState");
 //var required = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("required");
 if (editState != "true") {
  if($(element).find('span').length > 0) {
   var picker = $(element).find('input:first');
   picker.show();
   $(element).find('span').remove();
   return;
  }
  // 创建文本框
  var textBox = document.createElement("INPUT");
  textBox.className = "easyui-validatebox input-tdlarge noboder-input";
  $(textBox).attr('invalidMessage', '请选择到县一级住址!');
  textBox.type = "text";
  var id = element.parentNode.parentNode.rows[0].cells[element.cellIndex]
    .getAttribute("name")
    + element.parentNode.rowIndex;
  textBox.id = id;
  
  // 设置文本框当前值
  var text = element.innerText;
  if (!value) {
   value = element.getAttribute("Value");
  }
  textBox.value = value;
  ClearChild(element);
  element.appendChild(textBox);
  
  // 创建easyui的下拉框
  var dataSourceId = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("dataSource");
  $('#' + id).addresspicker({
   url : dataSourceId,
   steped:true,
   initValue:bool?{}:{value:value,text:text},
   zIndex : 1060,
   header:'全国',
   requireCallback:function(value) {
    return !(value && value.match('^\\d+0{5}$'));
   },
   onChange:function(value, values, names, finish) {
    if(finish) {
     // 设置address的值
     $(element.parentNode).find('td:first')[0].setAttribute("value" ,names.join(''));
     CancelEditCell($('#' + id)[0].parentNode, value, names.join(''), id);
    }
   }
  });
  $(element).on("postpaste", function() {
   $('#' + id).addresspicker('setAddress',this.firstChild.value.replace(new RegExp('-','g'),''));
  }).pasteEvents();
  if(bool) {
   $('#' + id).addresspicker('setAddress', text);
  }
  // 记录状态的改变
  element.setAttribute("EditState", "true");
  element.parentNode.parentNode.setAttribute("LastEditRow",
    element.parentNode.rowIndex);
 }

}

//为单元格创建可编辑补充输入框--身份证验证
function CreateSuffix(element, value) {
 // 检查编辑状态,如果已经是编辑状态,跳过
 var editState = element.getAttribute("EditState");
 var required = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("required");
 if (editState != "true") {
  // 创建文本框
  var textBox = document.createElement("INPUT");
  textBox.type = "text";
  if(required == 'required') {
   textBox.className = "EditCell_TextBox easyui-validatebox";
   $(textBox).validatebox({required:true});
  }else {
   textBox.className = "EditCell_TextBox easyui-validatebox";
   $(textBox).validatebox({validType:'idcard'});   
  }

  // 设置文本框当前值
  if (!value) {
   value = element.getAttribute("Value") == undefined ? '' : element.getAttribute("Value");
  }
  textBox.value = value;

  // 设置文本框的失去焦点事件
  textBox.onblur = function() {
   if($(this).validatebox('isValid')) {    
    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 CancelEditCell(element, value, text, id) {
 element.setAttribute("Value", value);
 if(id) { //如果是easyuicombotree不销毁控件
  $('#'+id).hide();
  $('#'+id).next().hide();
  $('#'+id).prev().hide();
  if(text) {
   $(element).append('<span>'+text+'</span>');
  }else {
   $(element).append('<span>'+value+'</span>');
  }
 }else {
  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) {
 if(_maxRow && table.rows.length > _maxRow) {
  return;
 }
 //var lastRow = table.rows[table.rows.length - 1];
 var lastRow = table.rows[0];
 var newRow = lastRow.cloneNode(true);
 table.tBodies[0].appendChild(newRow);
 $(newRow).find('th').each(function(i , n) {
  var editType = table.rows[0].cells[i].getAttribute('EditType');
  if(i == 0) {
   $(this).replaceWith('<td style="border:1px solid #ccc; text-align:center;">'+$(this).html()+'</td>');
  }else if(editType == 'No'){
   $(this).replaceWith('<td style="border:1px solid #ccc; text-align:center;">'+(table.rows.length - 1)+'</td>');
  }else if(editType == 'Text'){
   $(this).replaceWith('<td style="border:1px solid #ccc; text-align:center;">'+table.rows[0].cells[i].getAttribute('name')+'</td>');   
  }else if(editType == 'Date'){
   var element = document.createElement("TD");
   element.style.border = '1px solid #ccc';
   element.style.textAlign = 'center';
   $(this).replaceWith(element);
   var required = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("required");
   var textBox = document.createElement("INPUT");
   textBox.type = "text";
   var id = element.parentNode.parentNode.rows[0].cells[element.cellIndex]
   .getAttribute("name")
   + element.parentNode.rowIndex;
   textBox.id = id;
   textBox.className = "easyui-datebox";
   
   // 设置文本框当前值
   //ClearChild(element);
   element.appendChild(textBox);
   
   // 创建easyui的下拉框
   $('#' + id).datebox({
    required : required == 'required',
    editable : false,
    /*onSelect:function(date) {
     var year = date.getFullYear();
     var month = date.getMonth() + 1;
     var day = date.getDate();
     var dateStr = year + '-' + (month < 10 ? '0' + month : month) + '-' + (day < 10 ? '0' + day : day);
     $('#' + id).val(dateStr);
     // 设置文本框的失去焦点事件
     CancelEditCell($('#' + id)[0].parentNode, dateStr, dateStr, id);
    },*/
    onHidePanel:function() {
     var dateStr = $('#' + id).datebox('getValue');
     $('#' + id).val(dateStr);
     CancelEditCell($('#' + id)[0].parentNode, dateStr, dateStr, id);
    }
   });
   
   // 记录状态的改变
   element.setAttribute("EditState", "true");
   element.parentNode.parentNode.setAttribute("LastEditRow",
     element.parentNode.rowIndex);
  }else if(editType == 'DropDownList') {
   var element = document.createElement("TD");
   element.style.border = '1px solid #ccc';
   element.style.textAlign = 'center';
   $(this).replaceWith(element);
   var required = element.parentNode.parentNode.rows[0].cells[element.cellIndex].getAttribute("required");
   // 创建文本框
   var textBox = document.createElement("INPUT");
   textBox.type = "text";
   var id = element.parentNode.parentNode.rows[0].cells[element.cellIndex]
     .getAttribute("name")
     + element.parentNode.rowIndex;
   textBox.id = id;
   textBox.className = "easyui-combobox";

   // 设置文本框当前值
   //var text = element.innerText;
   ClearChild(element);
   element.appendChild(textBox);

   // 创建easyui的下拉框
   var dataSourceId = element.parentNode.parentNode.rows[0].cells[element.cellIndex]
   .getAttribute("dataSource");
   $('#' + id).combobox({
    url : dataSourceId,
    valueField:'id',
    textField:'name',
    required : required == 'required',
    filter: function (q, row) {
                var opts = $(this).combobox('options');
                return row[opts.textField].toLowerCase().indexOf(q.toLowerCase()) >= 0;
            },
      onHidePanel: function () {
                //文本框内的文本;
                var txt_Box = $("#" + id).combobox('getText');
                //获取列表数据;
                var listdata = $.data(this, "combobox");
                var rowdata = listdata.data;
                //遍历列表,若匹配则将值设为当前列并返回;否则将值设为null;
                for (var i = 0; i < rowdata.length; i++) {
                    var _row = rowdata[i];
                    var txt_Val = _row["name"];
                    if (txt_Box && txt_Val.toLowerCase().indexOf(txt_Box.toLowerCase()) != -1) {
                     $("#" + id).combobox('setText', txt_Val);
                        $("#" + id).combobox('setValue', _row["id"]);
                        $("#" + id).val(_row["id"]);
                        CancelEditCell($('#' + id)[0].parentNode, _row["id"], txt_Val, id);
                        return;
                    }
                }
      },
    onSelect:function(node) {
     $('#' + id).val(node.name);
     // 设置文本框的失去焦点事件
     //CancelEditCell($('#' + id)[0].parentNode, node.name, node.name, id);
    }
   });

   // 记录状态的改变
   element.setAttribute("EditState", "true");
   element.parentNode.parentNode.setAttribute("LastEditRow",
     element.parentNode.rowIndex);
  }else{
   $(this).replaceWith('<td style="border:1px solid #ccc;"></td>');   
  }
 });
 SetRowCanEdit(newRow);
 return newRow;

}
// 初始化数据bool:true 添加一行,bool:false 添加多行
function InitRow(table, dataStr, bool) {
 if(_maxRow && table.rows.length >= _maxRow) {
  return;
 }
 if(!bool) {  
  //先清空数据
  $(table).find('td').remove();
 }
 if(dataStr != '') {
  var obj = [];
  if(bool) {
   obj.push(dataStr);
  }else {   
   obj = eval("("+dataStr+")");
  }
  for(var i = 0 ; i < obj.length ; i++) {
   //添加一行
   var lastRow = table.rows[0];
   var newRow = lastRow.cloneNode(true);
   table.tBodies[0].appendChild(newRow);
   $(newRow).find('th').each(function(index , n) {
    var name = table.rows[0].cells[index].getAttribute("name");
    var editType = table.rows[0].cells[index].getAttribute("EditType");
    if(index == 0) {
     $(this).replaceWith('<td bgcolor="#ffffff" value="'+obj[i][name]+'">'+$(this).html()+'</td>');
    }else {
     if(editType == 'DropDownList' || editType == 'Picker') {
      var text = table.rows[0].cells[index].getAttribute("text");
      $(this).replaceWith('<td bgcolor="#ffffff" value = "'+obj[i][name]+'">'+obj[i][text]+'</td>');
     }else if(editType == 'TextBox' || editType == 'Suffix'){      
      $(this).replaceWith('<td bgcolor="#ffffff" value = "'+(obj[i][name] === 'null'?'':obj[i][name])+'">'+(obj[i][name] === 'null'?'':obj[i][name])+'</td>');
     }
    }
   });
   //设置为可编辑
   SetRowCanEdit(newRow, true);
  }
 }
}

// 删除行
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) {
     // 执行删除
     try{
      delCallBack(table, index,i);
     }catch(e){};
     table.deleteRow(i);
    }
   }
  }
 }
}

//全选功能

// 提取表格的值,JSON格式
function GetTableData(table) {
 var tableData = new Array();
 //alert("行数:" + table.rows.length);
 for ( var i = 1; i < table.rows.length; i++) {
  var row = GetRowData(table.rows[i]);
  if(row === -1) {
   throw 'required validate error!';
  }else if(row) {
   tableData.push(row);
  }
 }
 return tableData;

}
// 提取指定行的数据,JSON格式
function GetRowData(row) {
 var rowData = {};
 var has = false;
 var _error = false;
 for ( var j = 0; j < row.cells.length; j++) {
  var name = row.parentNode.rows[0].cells[j].getAttribute("Name");
  var required = row.parentNode.rows[0].cells[j].getAttribute("required");
  //var editType = row.parentNode.rows[0].cells[j].getAttribute("EditType");
  if (name) {
   var value = row.cells[j].getAttribute("Value");
   if(required && !value) {
    $(row.cells[j]).find('input').click();
    row.cells[j].click();
    _error = true;
    continue;
   }
   /*if (editType == 'Suffix') {
    value = row.cells[j].innerHTML;
   }*/
   if(!has && value) {
    has = true;
   }
   rowData[name] = value;
  }
 }
 if(has && _error) {/*has为true:不全为空、_error为true:录入不全*/
  return -1;
 }
 // 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);
}

// /////////////////////////////////////////////////////////////////////////////////
/**
 * onpostpaste事件
 */
$.fn.pasteEvents = function(delay) {
 if (delay == undefined)
  delay = 20;
 return $(this).each(function() {
  var $el = $(this);
  $el.on("paste", function() {
   $el.trigger("prepaste");
   setTimeout(function() {
    $el.trigger("postpaste");
   }, delay);
  });
 });
};
/**
 * 格式化数字显示方式 用法 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(/\.$/, '');
}


  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>    
0 0
原创粉丝点击