英语专业转前端,在家学习ing。
网上看到全选和取消全选代码,于是下午自己也试一试;
首先实现上图基本布局。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>全选</title>
</head>
<body>
<table>
<thead>
<tr>
<td><input type="checkbox">全选</td>
<td>商品名</td>
<td>价格</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox">添加到购物车</td>
<td>1</td>
<td>13.5</td>
<td><button>删除</button></td>
</tr>
<tr>
<td><input type="checkbox">添加到购物车</td>
<td>2</td>
<td>13.5</td>
<td><button>删除</button></td>
</tr>
<tr>
<td><input type="checkbox">添加到购物车</td>
<td>3</td>
<td>13.5</td>
<td><button>删除</button></td>
</tr>
<tr>
<td><input type="checkbox">添加到购物车</td>
<td>4</td>
<td>13.5</td>
<td><button>删除</button></td>
</tr>
</tbody>
<tfoot>
<tr >
<td colspan="2">总数量:<span></span></td>
<td colspan="2">总价格:<span></span></td>
</tr>
</tfoot>
</table>
</body>
</html>
然后是书写js代码。
第一步是实现全选效果
function $(selector){
return document.querySelectorAll(selector)
}
var selAll=$("thead input")[0];
var inputs=$("tbody input");
// 实现全选和取消全选,遍历子项,子项状态应该与全选状态相同
selAll.onclick=function(){
for(var i=0,iLength=inputs.length;i<iLength;i++){
inputs[i].checked=selAll.checked;
}
}
可是,在全选状态下,单击某一子项,应该实现取消全选;同理,如果子项全部选中,全选状态也应修改。于是开始补充以下代码。
$("tbody")[0].onclick=function(e){
if(e.target.nodeName.toLowerCase()=="input"){
for(var i=0,iLength=inputs.length,num=0;i<iLength;i++){
if(inputs[i].checked==false){
num--;
selAll.checked=false;
}
if(inputs[i].checked==true){
num++;
if(num==(inputs.length-1)){
selAll.checked=true
}
}
}
}
}
为了优化,
给tbody绑定单击事件,继而判断子项情况。
子项和全选之间引入关联变量num作判断;
用iLength接住子项长度;
但在num==(inputs.length-1)中,不用iLength判断,仍然使用inputs.length,这是因为有可能input父级tr可能是动态变化的;(如果不是动态变化,建议仍使用iLength)