/**
* JS实现可编辑的表格
* 用法:EditTables(tb1,tb2,tb2,......);
* Create by Senty at 2008-04-12
**/
//设置多个表格可编辑
functionEditTables() {for (var i = 0; i < arguments.length; i++) { //arguments叫做类数组对象
SetTableCanEdit(arguments[i]); //设置表可以编辑
}
}//设置表格单击事件
functionSetTableCanEdit(table) {for (var i = 1; i < table.rows.length; i++) { //循环传递过来的对象的行 第0行不传递
SetRowCanEdit(table.rows[i]); //设置行可以编辑
}
}functionSetRowCanEdit(row) {for (var j = 0; j < row.cells.length; j++) { //循环传递过来的对象的单元格
//如果当前单元格指定了编辑类型,则表示允许编辑
var editType = row.cells[j].getAttribute("EditType"); //方法返回指定属性名的属性值。
if (!editType) { //editType = null 表示单元格没有指定
//如果当前单元格没有指定,则查看当前列是否指定
editType = row.parentNode.rows[0].cells[j].getAttribute("EditType"); //传递过来的行的父元素下的行集合的第一行的指定属性名的属性值
}if (editType) { //单元格指定的有EditType属性值
row.cells[j].onclick = function () { //该单元格添加 单击事件
EditCell(this); //调用编辑单元格方法 //传递单元格对象
}
}
}
}//设置指定单元格可编辑
functionEditCell(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); //调用创建文本框函数,传递td和td中的内容
break;case "DropDownList": //指定的是下拉框
CreateDropDownList(element);break;default:break;
}
}//为单元格创建可编辑输入框
functionCreateTextBox(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");//获取td指定属性名的Value属性值
}
textBox.value= value;//编辑框 内容赋值
//设置文本框的失去焦点事件
textBox.onblur = function() {
CancelEditCell(this.parentNode, this.value); //取消编辑 单元格事件 //传递td 和编辑框的内容
}//向当前单元格添加文本框
ClearChild(element); //清空td中的内容
element.appendChild(textBox);//td追加这个元素
textBox.focus(); //获得焦点
textBox.select(); //内容全选
//改变状态变量
element.setAttribute("EditState", "true"); //设置指定属性名和属性值
element.parentNode.parentNode.setAttribute("CurrentRow", element.parentNode.rowIndex);//设置这个td父元素的父元素的currentrow属性为这个元素的父元素的所在行
}
}//为单元格创建选择框
functionCreateDropDownList(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");//td所在列的属性值
}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");//获取td的值
}
downList.value=value;//设置创建下接框的失去焦点事件
downList.onblur = function() {
CancelEditCell(this.parentNode, this.value, this.options[this.selectedIndex].text); //取消编辑单元格
}//向当前单元格添加创建下接框
ClearChild(element); //清空td下内容
element.appendChild(downList); //追加下拉框
downList.focus();//获得焦点
//记录状态的改变
element.setAttribute("EditState", "true");
element.parentNode.parentNode.setAttribute("LastEditRow", element.parentNode.rowIndex);
}
}//取消单元格编辑状态
functionCancelEditCell(element, value, text) {
element.setAttribute("Value", value); //设置td的Value属性为编辑框内容
if(text) {
element.innerHTML=text;
}else{
element.innerHTML= value; //td插入这个传递过来的编辑框内容
}
element.setAttribute("EditState", "false"); //设置编辑状态为假
//检查是否有公式计算
CheckExpression(element.parentNode);
}//清空指定对象的所有字节点
functionClearChild(element) {
element.innerHTML= "";
}//添加行
functionAddRow(table, index) {var lastRow = table.rows[table.rows.length - 1];var newRow = lastRow.cloneNode(true);
table.tBodies[0].appendChild(newRow);
SetRowCanEdit(newRow);returnnewRow;
}//删除行
functionDeleteRow(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格式
functionGetTableData(table) {var tableData = newArray();
alert("行数:" +table.rows.length);for (var i = 1; i < table.rows.length; i++) {
tableData.push(GetRowData(tabProduct.rows[i]));
}
console.log(tableData);returntableData;
}//提取指定行的数据,JSON格式
functionGetRowData(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"]);
returnrowData;
}//检查当前数据行中需要运行的字段
functionCheckExpression(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);
}
}
}
}//计算需要运算的字段
functionExpression(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, ""));
}
}returneval(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*/
functionformatNumber(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(/\.$/, '');
}