1.在生活我们经常遇到点击“全选”按钮就能够选中列表里面所有的项目,点击“反选”就能够把选中的取消掉,没选中的选上,这类功能是如何通过JavaScript代码实现的呢?下面为大家介绍下。
2.首先我们把HTML骨架搭建好,基本效果图和代码如下:
效果图:
代码实现:
<!DOCTYPE html>
<html>
<head>
<title>全选和反选</title>
<style type="text/css">
table {
margin: 0 auto;
border: 1px solid red;
}
</style>
</head>
<body>
<div>
<table>
<thead>
<tr>
<th><input type="checkbox"></th>
<th>商品名称</th>
<th>商品价格</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>笔记本电脑</th>
<th>8000</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>内存</th>
<th>500</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>固态硬盘</th>
<th>300</th>
</tr>
</thead>
</table>
</div>
</body>
</html>
3.我们要把问题简单化,首先实现第一步,如果点击全选按钮,则下面商品的选择按钮也要选中。有了这个思路,我们开始编写代码,实现代码如下:
<!DOCTYPE html>
<html>
<head>
<title>全选和反选</title>
<style type="text/css">
table {
margin: 0 auto;
border: 1px solid red;
}
</style>
</head>
<body>
<div>
<table>
<thead>
<tr>
<th><input type="checkbox" id="f_cbox"></th>
<th>商品名称</th>
<th>商品价格</th>
</tr>
</thead>
<tbody id="s_cbox">
<tr>
<th><input type="checkbox"></th>
<th>笔记本电脑</th>
<th>8000</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>内存</th>
<th>500</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>固态硬盘</th>
<th>300</th>
</tr>
</tbody>
</table>
</div>
<!-- 编写JavaScript -->
<script type="text/javascript">
// 1.首先获取点击全选按钮ID
var f_cbox = document.getElementById('f_cbox');
// 2.给其注册点击事件
f_cbox.onclick = function () {
// 3.让所有子类的状态和父类的一样,通过循环的方法获取到每个子类状态
// 3.1获取到子类集合
var checkboxs = document.querySelectorAll('#s_cbox input[type=checkbox]');
// 3.2通过循环获取子类
var i = 0, len = checkboxs.length;
for (; i < len; i++) {
// 遍历取到每一个子类
var checkbox = checkboxs[i];
// 设置子类状态和父类一致
checkbox.checked = this.checked;
}
}
</script>
</body>
</html>
4.此时这个点击全选,然后选中子类就完成了,接下来实现的功能就是子类一旦全选,则第一行的全选按钮就显示为选中,如果有一个没有全选,则第一行的全选按钮就显示没有被选中,效果图如下:
全选中:
一个没有选中:
代码实现如下:
<!DOCTYPE html>
<html>
<head>
<title>全选和反选</title>
<style type="text/css">
table {
margin: 0 auto;
border: 1px solid red;
}
</style>
</head>
<body>
<div>
<table>
<thead>
<tr>
<th><input type="checkbox" id="f_cbox"></th>
<th>商品名称</th>
<th>商品价格</th>
</tr>
</thead>
<tbody id="s_cbox">
<tr>
<th><input type="checkbox"></th>
<th>笔记本电脑</th>
<th>8000</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>内存</th>
<th>500</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>固态硬盘</th>
<th>300</th>
</tr>
</tbody>
</table>
</div>
<!-- 编写JavaScript -->
<script type="text/javascript">
// 1.首先获取点击全选按钮ID
var f_cbox = document.getElementById('f_cbox');
// 2.给其注册点击事件
f_cbox.onclick = function () {
// 3.让所有子类的状态和父类的一样,通过循环的方法获取到每个子类状态
// 3.1获取到子类集合
var checkboxs = document.querySelectorAll('#s_cbox input[type=checkbox]');
// 3.2通过循环获取子类
var i = 0, len = checkboxs.length;
for (; i < len; i++) {
// 遍历取到每一个子类
var checkbox = checkboxs[i];
// 设置子类状态和父类一致
checkbox.checked = this.checked;
}
}
// 1.首先获取到子类集合
var checkboxs = document.querySelectorAll('#s_cbox input[type=checkbox]');
// 2.给所有子类注册点击事件
var i = 0, len = checkboxs.length;
for (; i < len; i++) {
var checkbox = checkboxs[i];
// 2.1给子类集合注册点击事件
checkbox.onclick = function() {
// 2.2声明一个布尔变量isAllChecked 用来判断子类是否全部选中
var isAllChecked = true;
for (i = 0; i < len; i++) {
checkbox = checkboxs[i];
// 判断如果有一个子类没有被选中就结束循环,不用再继续判断
if (!checkbox.checked) {
// 设置isAllChecked = false
isAllChecked = false;
// 结束循环
break;
}
}
// 如果子类全部被选中,就设置父类也被选中
f_cbox.checked = isAllChecked;
}
}
</script>
</body>
</html>
5.前两个基本功能都已经做完了,还剩最后一个反选功能,首先在HTML骨架上加上反选按钮代码。其次就是考虑如何实现反选,其实也就是循环遍历获取到每一个子元素的选中状态,然后把当前状态更改为与之相反的状态就行了,代码如下:
<!DOCTYPE html>
<html>
<head>
<title>全选和反选</title>
<style type="text/css">
table {
margin: 0 auto;
border: 1px solid red;
}
</style>
</head>
<body>
<div>
<table>
<thead>
<tr>
<th><input type="checkbox" id="f_cbox"></th>
<th>商品名称</th>
<th>商品价格</th>
</tr>
</thead>
<tbody id="s_cbox">
<tr>
<th><input type="checkbox"></th>
<th>笔记本电脑</th>
<th>8000</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>内存</th>
<th>500</th>
</tr>
<tr>
<th><input type="checkbox"></th>
<th>固态硬盘</th>
<th>300</th>
</tr>
<tr>
<th><input type="button" value="反选" id="btn"></th>
</tr>
</tbody>
</table>
</div>
<!-- 编写JavaScript -->
<script type="text/javascript">
// 1.首先获取点击全选按钮ID
var f_cbox = document.getElementById('f_cbox');
// 2.给其注册点击事件
f_cbox.onclick = function () {
// 3.让所有子类的状态和父类的一样,通过循环的方法获取到每个子类状态
// 3.1获取到子类集合
var checkboxs = document.querySelectorAll('#s_cbox input[type=checkbox]');
// 3.2通过循环获取子类
var i = 0, len = checkboxs.length;
for (; i < len; i++) {
// 遍历取到每一个子类
var checkbox = checkboxs[i];
// 设置子类状态和父类一致
checkbox.checked = this.checked;
}
}
// 1.首先获取到子类集合
var checkboxs = document.querySelectorAll('#s_cbox input[type=checkbox]');
// 2.给所有子类注册点击事件
var i = 0, len = checkboxs.length;
for (; i < len; i++) {
var checkbox = checkboxs[i];
// 2.1给子类集合注册点击事件
checkbox.onclick = function() {
// 2.2声明一个布尔变量isAllChecked 用来判断子类是否全部选中
var isAllChecked = true;
for (i = 0; i < len; i++) {
checkbox = checkboxs[i];
// 判断如果有一个子类没有被选中就结束循环,不用再继续判断
if (!checkbox.checked) {
// 设置isAllChecked = false
isAllChecked = false;
// 结束循环
break;
}
}
// 如果子类全部被选中,就设置父类也被选中
f_cbox.checked = isAllChecked;
}
}
// 实现反选功能
// 1.获取反选按钮id
var btn = document.getElementById('btn');
// 2.给按钮注册点击事件
btn.onclick = function () {
for (i = 0; i < len; i++) {
var checkbox = checkboxs[i];
checkbox.checked = !checkbox.checked;
}
// 2.2声明一个布尔变量isAllChecked 用来判断子类是否全部选中
var isAllChecked = true;
for (i = 0; i < len; i++) {
checkbox = checkboxs[i];
// 判断如果有一个子类没有被选中就结束循环,不用再继续判断
if (!checkbox.checked) {
// 设置isAllChecked = false
isAllChecked = false;
// 结束循环
break;
}
}
// 如果子类全部被选中,就设置父类也被选中
f_cbox.checked = isAllChecked;
}
</script>
</body>
</html>
6.至此这个代码就全部完成了,其实还有一些可以优化的,仔细观察下就能够发现有许多代码是粘贴的,至于优化后的代码就靠小伙伴们来实现了,如果不会可以联系我共同讨论。