JavaScript-表单项目全选和反选

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.至此这个代码就全部完成了,其实还有一些可以优化的,仔细观察下就能够发现有许多代码是粘贴的,至于优化后的代码就靠小伙伴们来实现了,如果不会可以联系我共同讨论。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值