JavaScript例子—实现行的增加、删除、全选、反选

今天偶尔上一个音乐网站发现音乐网站里面都提供全选和反选操作,觉得不错,加之最近项目上有相似之处,所以总结如下:
说明:addItem()实在敲回车后自动添加一行。这样用户体验比较好!
实现功能:实现行的增加,删除,全选,反选,金额的计算,四舍五入等。
问题:在如果使用模板来添加新行add(tbodyid)的话,那么第一行的任何数据都会被带到下一个新添加的行。
解决办法:不使用模板adds(tbodyid)来添加新行就可以解决这个问题。
customer.js:
[code]
/**
* @author fuhao
* @param {Object} tbodyid
* 首先在Html页面上定义一个标准的table模板
* table的子节点是tbody
* tbody的子节点是tr
* tr的子节点是td
* td的子节点是checkbox和input
*/
// 以table模板为标准,添加新的行的方法
// 该方法带来的问题:新添加的行会将模板行的数据也带下来了
// 解决办法:adds(tbodyid)方法可以解决这个问题
function add(tbodyid){
if(tbodyid==null){
alert("该方法需要的参数不正确");
return ;
}
// 得到tbody,也可以使用prototype.js里面的$(tbodyid)
var tbody = document.getElementById(tbodyid);
// var tbody = $(tbodyid);
// 获得tbody下的索引为1的tr
var trtemplate = tbody.childNodes[1];
// 得到tr下的td数组
var tds = trtemplate.childNodes;
// 得到该tr下所有td数组的长度
var trlength = tds.length;
var tr = document.createElement("tr");
for(var i=0;i<trlength;i++){
var td = document.createElement("td");
// 设置td的式样标记
td.className = tds[i].className;
var content = tds[i].innerHTML;
td.innerHTML = content;
tr.appendChild(td);
}
tbody.appendChild(tr);
}
// 删除选中行的方法
function del(name,tbodyid){
if(name==null){
alert("该方法需要的参数不正确");
return ;
}
// 获得数组
var names = document.getElementsByName(name);
var tbody= document.getElementById(tbodyid);
// 获得数组的长度
var length = names.length;
if(length==1){
alert("请至少保留一条记录");
return ;
}
// 定义一个数组
var arr = new Array();
try{
for(var i=0;i<length;i++){
if(names[i].checked==true){
// 将checkbox的父节点(td)的父节点(tr)放入数组里面
arr.push(names[i].parentNode.parentNode);
}
}
}catch(e){
alert("捕获到的异常是:"+e);
}
if(arr.length==0){
alert("请至少选择一条删除");
return ;
}
var delsure = confirm("确认要删除所选记录吗?");
if(!delsure){
return ;
}
for(var j=0;j<arr.length;j++){
if(arr.length == length){
alert("请至少保留一条记录");
return ;
}
// 如果引入prototype_1.5.js的话那么使用Element.remove(arr[j]);达到删除的目的
// Element.remove(arr[j]);
tbody.removeChild(arr[j]);
}
}
// 敲回车,则添加新的一行
function addItem(tbodyid){
// 13代表回车
if(event.keyCode==13){
add(tbodyid);
}
}
// 全部选择
function checkAll(name){
// 首先获得所有checkbox集合
var names = document.getElementsByName(name);
for(var i=0;i<names.length;i++){
names[i].checked=true;
}
}
// 取消选择--反选
function cancelCheck(name){
var names = document.getElementsByName(name);
var length = names.length;
for(var i=0;i<length;i++){
if(names[i].checked){
names[i].checked = false;
}else{
names[i].checked = true;
}
}
}

//用于自动补0的方法 如:5--5.00,5.5--5.50
function mend(number){
var str = number+"";
if (str.indexOf(".")==-1){ //说明没有小数点
return str+".00";
}else{ //说明有小数点
var tmp = str.substring(str.indexOf(".")+1);
if (tmp.length==0) return str+"00";
if (tmp.length==1) return str+"0";
if (tmp.length>=2) return str.substring(0,str.indexOf(".")+3);
}
}

//用于四舍五入的方法
function ForDight(Dight,How) {
Dight = Math.round(Dight*Math.pow(10,How))/Math.pow(10,How);
return mend(Dight);
}
// 统一的错误提示方法
function showError(str,b){
// 首先获得div
var div = document.getElementById("div");
// 显示错误提示语句
var strr = "<img src='image/error_m.gif' /><font color='red'>" +str+ "</font>";
if(b == false){
div.innerHTML = strr;
div.style.display = "";
}else{
div.style.display = "none";
}
}
// 计算(这里以数量作为参照物)
function calc(obj){
// obj.parentElement获取对象层次中的父对象
var td = obj.parentElement;
var tr = td.parentElement;
var numbers = tr.childNodes[4].childNodes[0].value; // 数量
//alert("numbers:"+numbers);
var faceValue = tr.childNodes[2].childNodes[0].value; //面值
//alert("faceValue:"+faceValue);
var additionValue = tr.childNodes[3].childNodes[0].value; //附赠
//alert("additionValue:"+additionValue);
//判断为空或者不为数字
if(numbers=="" || faceValue=="" || additionValue=="" || isNaN(numbers) || isNaN(faceValue) || isNaN(additionValue)){
// alert("--你的输入有误,数量为非空正整数,面值和附赠应为非空正数--");
tr.childNodes[5].childNodes[0].value = "";
tr.childNodes[6].childNodes[0].value = "";
tr.childNodes[7].childNodes[0].value = "";
showError("你的输入有误,数量为非空正整数,面值和附赠应为非空正数",false);
return ;
}else{
showError("",true);
}
//判断是否小于零或者数量为整数
if(numbers<=0*1 || faceValue<=0*1 || additionValue<=0*1 || numbers.indexOf(".")!=-1){
// alert("--你的输入有误,数量为非空正整数,面值和附赠应为非空正数--");
tr.childNodes[5].childNodes[0].value = "";
tr.childNodes[6].childNodes[0].value = "";
tr.childNodes[7].childNodes[0].value = "";
showError("你的输入有误,数量为非空正整数,面值和附赠应为非空正数",false);
return ;
}else{
showError("",true);
}
var faceValues = numbers*faceValue; //面值金额
var additionValues = numbers*additionValue;//附赠金额
var faceValueAll = faceValues+additionValues; //面值总额
// 赋值
tr.childNodes[5].childNodes[0].value = ForDight(faceValues,2);
tr.childNodes[6].childNodes[0].value = ForDight(additionValues,2);
tr.childNodes[7].childNodes[0].value = ForDight(faceValueAll,2);
}
// 计算实收金额的方法
function calcs(obj){
// obj.parentElement获取对象层次中的父对象
var td = obj.parentElement;
var tr = td.parentElement;
var numbers = tr.childNodes[4].childNodes[0].value; // 数量
var price = tr.childNodes[8].childNodes[0].value; //单价
var agio = tr.childNodes[9].childNodes[0].value; //折扣
if(numbers=="" || price=="" || isNaN(numbers) || isNaN(price) || isNaN(agio)){
tr.childNodes[10].childNodes[0].value = "";
showError("数量应该为非空正整数,单价和折扣应为非空正数",false);
return ;
}else{
showError("",true);
}
if(numbers<=0*1 || numbers.indexOf(".")!=-1 || price<=0*1){
tr.childNodes[10].childNodes[0].value = "";
showError("数量应该为非空正整数,单价不能小于零",false);
return ;
}else{
showError("",true);
}
var factValues = "" ;
if(agio==""){//说明没有填写折扣
factValues = price*numbers;
tr.childNodes[10].childNodes[0].value = ForDight(factValues,2);
}else{
if(agio<=0*1 || agio>10){
tr.childNodes[10].childNodes[0].value = "";
showError("折扣应该大于0小于10",false);
return ;
}else{
showError("",true);
factValues = price*numbers*agio;
tr.childNodes[10].childNodes[0].value = ForDight(factValues,2);
}
}

}

// 不以模板为标准添加新的一行
// obj.setAttribute()--把指定的属性设置成为指定的字符串值,如果该属性不存在则添加一个新的属性
function adds(tbodyid){
var tbody = document.getElementById(tbodyid);
var tr = document.createElement("tr");

var td = document.createElement("td");
var td1 = document.createElement("td");
var td2 = document.createElement("td");
var td3 = document.createElement("td");
var td4 = document.createElement("td");
var td5 = document.createElement("td");
var td6 = document.createElement("td");
var td7 = document.createElement("td");
var td8 = document.createElement("td");
var td9 = document.createElement("td");
var td10 = document.createElement("td");
var checkbox = document.createElement("<input type='checkbox' name='checkName' />");
checkbox.setAttribute("align","center");

var input1 = document.createElement("<input name='cardName' type='text' size='12' value='没有模板的' readonly='true' />");
var input2 = document.createElement("<input name='faceValue' type='text' size='12' οnchange='calc(this);calcs(this)' />");
var input3 = document.createElement("<input name='additionValue' type='text' size='12' οnchange='calc(this)' />");
var input4 = document.createElement("<input name='cardNumber' type='text' size='12' οnchange='calc(this);calcs(this)' />");
var input5 = document.createElement("<input name='faceValues' type='text' size='12' readonly='true' />");
var input6 = document.createElement("<input name='additionValues' type='text' size='12' readonly='true' />");
var input7 = document.createElement("<input name='faceValuesAll' type='text' size='12' readonly='true' />");
var input8 = document.createElement("<input name='price' type='text' size='12' οnchange='calcs(this)' />");
var input9 = document.createElement("<input name='agios' type='text' size='12' οnchange='calcs(this)' />");
var input10 = document.createElement("<input name='factValue' type='text' readonly='true' size='12' οnchange='calcs(this)' />");

td.setAttribute("align","center");
td1.setAttribute("align","center");
td2.setAttribute("align","center");
td3.setAttribute("align","center");
td4.setAttribute("align","center");
td5.setAttribute("align","center");
td6.setAttribute("align","center");
td7.setAttribute("align","center");
td8.setAttribute("align","center");
td9.setAttribute("align","center");
td10.setAttribute("align","center");

input1.setAttribute("align","center");
input2.setAttribute("align","center");
input3.setAttribute("align","center");
input4.setAttribute("align","center");
input5.setAttribute("align","center");
input6.setAttribute("align","center");
input7.setAttribute("align","center");
input8.setAttribute("align","center");
input9.setAttribute("align","center");
input10.setAttribute("align","center");

td.appendChild(checkbox);
td1.appendChild(input1);
td2.appendChild(input2);
td3.appendChild(input3);
td4.appendChild(input4);
td5.appendChild(input5);
td6.appendChild(input6);
td7.appendChild(input7);
td8.appendChild(input8);
td9.appendChild(input9);
td10.appendChild(input10);

tr.appendChild(td);
tr.appendChild(td1);
tr.appendChild(td2);
tr.appendChild(td3);
tr.appendChild(td4);
tr.appendChild(td5);
tr.appendChild(td6);
tr.appendChild(td7);
tr.appendChild(td8);
tr.appendChild(td9);
tr.appendChild(td10);

tbody.appendChild(tr);
}
[/code]
calc.html:
[code]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JavaScript例子</title>
<script src="js/customer.js"></script>
<link href="css/style.css" rel="stylesheet" type="text/css">
</head>
<body>
<a href="#" οnclick="add('DispatchItemTable')">增加一行(使用模板)</a>  
<a href="#" οnclick="del('checkName','DispatchItemTable')">删除</a>  
<a href="#" οnclick="checkAll('checkName')">全选</a>  
<a href="#" οnclick="cancelCheck('checkName')">反选</a>
<a href="#" οnclick="adds('DispatchItemTable')">增加一行(不使用模板)</a>
  面值金额=面值*数量  附赠金额=附赠*数量  
面值总额=面值金额+附赠金额  实收金额=单价*数量*折扣
</p>
<table id="table" align='center' border='1' bordercolor='#0690AE' cellpadding='0' cellspacing='0' style='border-collapse:collapse;' width='100%'>
<tbody id="DispatchItemTable">
<tr>
<td nowrap class='data_list_th'>序号</td>
<td class='data_list_th'>卡名称</td>
<td class='data_list_th'><font color="red">*</font>面值(元)</td>
<td class='data_list_th'><font color="red">*</font>附赠(元)</td>
<td class='data_list_th'><font color="red">*</font>数量(枚)</td>
<td class='data_list_th'>面值金额(元)</td>
<td class='data_list_th'>附赠金额(元)</td>
<td class='data_list_th'>面值总额(元)</td>
<td class='data_list_th'><font color="red">*</font>单价(元)</td>
<td class='data_list_th'><font color="red">*</font>折扣</td>
<td class='data_list_th'>实收金额(元)</td>
</tr>
<tr id="testc">
<td class='data_list_td'><input type="checkbox" name="checkName" /></td>
<td class='data_list_td'><input name="cardName" type="text" size="12" value="由模板生成的" readonly="true" οnkeydοwn="addItem('DispatchItemTable')" /></td>
<td class='data_list_td'><input name="faceValue" type="text" size="12" οnchange="calc(this);calcs(this)" /></td>
<td class='data_list_td'><input name="additionValue" type="text" size="12" οnchange="calc(this)" /></td>
<td class='data_list_td'><input name="cardNumber" type="text" size="12" οnchange="calc(this);calcs(this)" /></td>
<td class='data_list_td'><input type="text" name="faceValues" size="12" readonly="true" /></td>
<td class='data_list_td'><input type="text" name="additionValues" size="12" readonly="true" /></td>
<td class='data_list_td'><input type="text" name="faceValuesAll" size="12" readonly="true" /></td>
<td class='data_list_td'><input type="text" name="price" size="12" οnchange="calcs(this)" /></td>
<td class='data_list_td'><input type="text" name="agios" size="12" οnchange="calcs(this)" /></td>
<td class='data_list_td'><input type="text" name="factValue" size="12" readonly="true" /></td>
</tr>
</tbody>
</table>
<p><div align="center" id="div" style="display:none;" /></p>
</body>
</html>

[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值