描述:
- 默认进来显示"全选",选框未选中
- 选择"全选"选框,列表的选框全部选中,文字变成"全不选"
- 点击"全不选"选框,列表所有选框取消选中,文字变回"全选"
- 点击列表对应的选框,如果全部都选中,触发"全选"选框选中,文字变成"全不选"
- 取消任意一个列表选框,逻辑变成没有全选,取消"全选"选框选中,文字变成"全选"
- 按钮"反选",选中与列表选框相反的选框,逻辑上遵循上述全选规则
html和css代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>全选反选功能</title>
<style>
* {
padding: 0;
margin: 0;
}
.wrap {
width: 300px;
margin: 100px auto 0;
}
table {
border-collapse: collapse;
border-spacing: 0;
border: 1px solid #c0c0c0;
width: 300px;
}
th,
td {
border: 1px solid #d0d0d0;
color: #404060;
padding: 10px;
}
th {
background-color: #09c;
font: bold 16px "微软雅黑";
color: #fff;
}
td {
font: 14px "微软雅黑";
}
td:nth-of-type(1) {
text-align: center;
}
tbody tr,
tfoot tr {
background-color: #f0f0f0;
}
tbody tr:hover {
cursor: pointer;
background-color: #fafafa;
}
button {
width: 50px;
}
</style>
</head>
<body>
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll" />
<span id="txt">全选</span>
</th>
<th>菜名</th>
<th>饭店</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox" />
</td>
<td>红烧肉</td>
<td>好再来</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>西红柿鸡蛋</td>
<td>好再来</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>油炸榴莲</td>
<td>好再来</td>
</tr>
<tr>
<td>
<input type="checkbox" />
</td>
<td>清蒸助教</td>
<td>好再来</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="5"><button id="rev">反选</button></td>
</tr>
</tfoot>
</table>
</div>
</body>
</html>
JavaScript代码
//获取全选的这个复选框
var ckAll = get_id("j_cbAll");
//获取文字显示span
var txt = get_id("txt");
//获取tbody中所有的小复选框
var cks = get_els("j_tb", "input");
//点击全选的这个复选框,获取他当前的状态,然后设置tbody中所有复选框的状态
ckAll.onclick = function () {
console.log(this.checked);
for (var i = 0; i < cks.length; i++) {
cks[i].checked = this.checked;
}
//顺便修改文本显示
txt.innerText = this.checked ? "全不选" : "全选";
};
//获取tbody中所有的复选框,分别注册点击事件
for (var i = 0; i < cks.length; i++) {
/* cks[i].onclick = function () {
var flag = true; //默认都被选中了
//判断是否所有的复选框都选中
for (var j = 0; j < cks.length; j++) {
if (!cks[j].checked) {
//没选中就进来了
flag = false;
break;
}
}
//全选的这个复选框的状态就是flag这个变量的值
ckAll.checked = flag;
//记得修改文本显示
txt.innerText = flag?"全不选":"全选";
}; */
cks[i].onclick = fn;
}
// 反选功能
// 获取按钮
var btn = get_id("rev");
btn.onclick = function () {
for (var i = 0; i < cks.length; i++) {
cks[i].checked = !cks[i].checked
}
fn();
}
// 代码复用,函数封装
function fn() {
var flag = true; //默认都被选中了
//判断是否所有的复选框都选中
for (var j = 0; j < cks.length; j++) {
if (!cks[j].checked) {
//没选中就进来了
flag = false;
break;
}
}
//全选的这个复选框的状态就是flag这个变量的值
ckAll.checked = flag;
//记得修改文本显示
txt.innerText = flag ? "全不选" : "全选";
}