*{ margin:0; padding:0; font-size:14px}
#box{ width:500px; margin:100px auto}
table,th,td{ border:1px solid #000; border-collapse:collapse}
td,th{ width:100px; height:30px; padding:10px}
input[type="text"]{ display:none; height:24px; width:60px; border:1px solid #ccc;}
tbody tr td:first-child{text-align: center;}
tfoot td{text-align: right;}
.editBtn{ color:#666}
.delBtn{ color:red}
.okBtn,.cancelBtn{ display:none}
.edit span{ display:none}
.edit input[type="text"]{ display:inline-block}
.edit .editBtn,.edit .delBtn{ display:none}
.edit .okBtn,.edit .cancelBtn{ display:inline}
<body>
<div id="box">
<table>
<thead>
<tr>
<th><label>全选:<input type="checkbox" id="allCheck"/></label></th>
<th>名称</th>
<th>单价</th>
<th>数量</th>
<th>编辑</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox" class="check"/></td>
<td><span>张三</span><input type="text"></td>
<td><span>18</span><input type="text"></td>
<td><span>1</span><input type="text"></td>
<td>
<a href="javascript:;" class="editBtn">编辑</a>
<a href="javascript:;" class="okBtn">确定</a>
<a href="javascript:;" class="cancelBtn">取消</a>
<a href="javascript:;" class="delBtn">删除</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="check"/></td>
<td><span>李四</span><input type="text"></td>
<td><span>25</span><input type="text"></td>
<td><span>2</span><input type="text"></td>
<td><a href="javascript:;" class="editBtn">编辑</a><a href="javascript:;" class="okBtn">确定</a> <a href="javascript:;" class="cancelBtn">取消</a><a href="javascript:;" class="delBtn">删除</a></td>
</tr>
<tr>
<td><input type="checkbox" class="check"/></td>
<td><span>小强</span><input type="text"></td>
<td><span>22</span><input type="text"></td>
<td><span>3</span><input type="text"></td>
<td><a href="javascript:;" class="editBtn">编辑</a><a href="javascript:;" class="okBtn">确定</a> <a href="javascript:;" class="cancelBtn">取消</a><a href="javascript:;" class="delBtn">删除</a></td>
</tr>
<tr>
<td><input type="checkbox" class="check"/></td>
<td><span>小明</span><input type="text"></td>
<td><span>16</span><input type="text"></td>
<td><span>4</span><input type="text"></td>
<td><a href="javascript:;" class="editBtn">编辑</a><a href="javascript:;" class="okBtn">确定</a> <a href="javascript:;" class="cancelBtn">取消</a><a href="javascript:;" class="delBtn">删除</a></td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5">总价:¥<b id="money"></b></td>
</tr>
</tfoot>
</table>
</div>
<script src="tools.js"></script>
<script>
var box = tools.$("#box");
var table = tools.$("table",box)[0];
var tbody = tools.$("tbody", box)[0];
var allCheck = tools.$("#allCheck");
var n = 0; // 记录单选按钮被选中的数量
table.onclick = function(e){
e = e || event;
//找到事件源
var target = e.target || e.srcElement;
//找到当前tr
var tr = target.parentNode.parentNode;
//判断事件源
if(target.className === "editBtn"){
//编辑按钮
//切换span和input得显示隐藏
tr.className = "edit";
//找到当前行所有span,把span得内容给到对应的input.value
var aSpan = tools.$("span", tr);
for(var i = 0; i < aSpan.length; i++){
aSpan[i].nextElementSibling.value = aSpan[i].innerHTML;
}
}else if(target.className === "okBtn"){
//确定按钮
tr.className = "";
var aSpan = tools.$("span", tr);
for(var i = 0; i < aSpan.length; i++){
aSpan[i].innerHTML = aSpan[i].nextElementSibling.value;
}
calcPrice();
}else if(target.className === "cancelBtn"){
//取消
tr.className = "";
}else if(target.className === "delBtn"){
if(confirm("你真的不买我了吗?")){
tr.parentNode.removeChild(tr);
//判断当前一行是否被选中
var check = tools.$(".check", tr)[0];
//如果被选中,n减一
if(check.checked) n--;
//判断n跟aCheck的length的关系
allCheck.checked = (n===tools.$(".check", box).length);
calcPrice();
}
}else if(target.id === "allCheck"){
//全选
//找到所有的单选
var aCheck = tools.$(".check", box);
for(var i = 0; i < aCheck.length; i++){
//单选得状态跟全选同步
aCheck[i].checked = target.checked;
}
//n得值也要修改
n = target.checked ? aCheck.length : 0;
calcPrice();
}else if(target.className === "check"){
target.checked ? n++ : n--;
var aCheck = tools.$(".check", box);
allCheck.checked = n === aCheck.length;
calcPrice();
}
}
function calcPrice(){
var sum = 0;
//找到被选中的那些行,然后把这些行的单价X数量,累加
var aTr = tools.$("tr", tbody);
for(var j = 0; j < aTr.length; j++){
if(tools.$(".check", aTr[j])[0].checked){
var price = Number(tools.$("span", aTr[j])[1].innerHTML);
var num = Number(tools.$("span", aTr[j])[2].innerHTML);
sum += price*num;
}
}
tools.$("#money").innerHTML = sum + "元";
}
</script>
</body>
tool.js
var tools = {
/* 查找DOM对象
* @param selector string css基本选择器
* @param [parent] DOMobj 父级元素对象
* @return DOMobj || HTMLCollection
*/
$: function(selector ,parent){
parent = parent || document;
switch(selector.charAt(0)){
case "#":
return document.getElementById(selector.slice(1));
case ".":
return parent.getElementsByClassName(selector.slice(1));
default:
return parent.getElementsByTagName(selector);
}
},
/*获取外部样式
* @param obj DOMobj 要获取属性的DOM对象
* @param attr string 获取某一条属性的属性名
* @return string obj的attr属性值
*/
getStyle: function(obj, attr){
if(obj.currentStyle){ //针对IE
return obj.currentStyle[attr];
}else{
return getComputedStyle(obj,false)[attr];
}
},
/* 获取body宽高
*
* @return obj {width,height}
* */
getBody: function(){
return {
width: document.documentElement.clientWidth || document.body.clientWidth,
height: document.documentElement.clientHeight || document.body.clientHeight
};
},
/*让元素在body里绝对居中
* @param obj DOMobj 居中的那个元素对象
*/
showCenter: function(obj){
//console.log(this);
//this在不同执行环境指向的对象是不一样的,所以用一个变量在指向变化之前先存下来
var _this = this;
//obj相对于body定位
document.body.appendChild(obj);
obj.style.position = "absolute";
function center(){
//console.log(_this);
var _left = (_this.getBody().width - obj.offsetWidth)/2,
_top = (_this.getBody().height - obj.offsetHeight)/2;
obj.style.left = _left + "px";
obj.style.top = _top + "px";
}
center();
window.onresize = center;
},
/* 设置样式
* @param obj DOMobj 设置谁的样式
* @param oAttr obj {left:"200px",top:"100px"}
* */
css: function(obj,oAttr){
}
//tools.css(div,{left:"200px",width:"100px"});
}