欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js实现多选,全选,反选的功能

程序员文章站 2022-05-31 10:54:50
...

需求:在前端页面实现一个多选的模块,我们可以全选/不选,多选,反选。

思路:需要按钮或者是多选框,最主要的是什么,能获取到四个等待选择的对象【足球、篮球这些】,还有一个,被选中的状态是什么?没有被选中的状态又是什么?通过查阅手册,第三项,checked表示选中状态[true|false].

等待改进的地方:得把js和html分离开来,从外部引入js,还有,我们每次给对应的按钮或者多选框添加一个onclick函数时,代码十分相似,这个可以把公共部分提取出来,减少冗余
js实现多选,全选,反选的功能
代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<style type="text/css">
			#outer{
				margin:0;
				padding:0;
			}
		</style>
		<title></title>
	</head>
	<body>
		<form action="post">
			你爱好的运动是?<input type="checkbox" id="checkedAllBox" />全选/全不选<br/> 
			<input type="checkbox" name="items" value="足球" />足球
			<input type="checkbox" name="items" value="篮球" />篮球
			<input type="checkbox" name="items" value="羽毛球" />羽毛球
			<input type="checkbox" name="items" value="乒乓球" />乒乓球
			<br>
			<input type="button" id="checkAllBtn" value="全选" />
			<input type="button" id="checkNoBtn" value="全不选" />
			<input type="button" id="checkRevBtn" value="反选" />
			<input type="button" id="sendBtn" value="提交" />
		</form>
		
		<script>
			//全选
			var cheakallbtn = document.getElementById("checkAllBtn");
			cheakallbtn.onclick=function(){
				//获取四个多选框
				var items=document.getElementsByName("items");
				
				for(var i=0;i<items.length;++i)
				{
					items[i].checked=true;//设置为选中状态
				}
			};
			
			//全不选
			var cheaknobtn = document.getElementById("checkNoBtn");
			cheaknobtn.onclick=function(){
				//获取四个多选框
				var items=document.getElementsByName("items");
				
				for(var i=0;i<items.length;++i)
				{
					items[i].checked=false;//设置为选中状态
				}
			};
			
			//反选
			var checkrevbtn = document.getElementById("checkRevBtn");
			checkrevbtn.onclick=function(){
				//获取四个多选框
				var items=document.getElementsByName("items");
				
				for(var i=0;i<items.length;++i)
				{
					items[i].checked= !items[i].checked;
				}
			};
			
			//提交
			var sendbtn = document.getElementById("sendBtn");
			sendbtn.onclick=function(){
				//获取四个多选框
				var items=document.getElementsByName("items");
				
				for(var i=0;i<items.length;++i)
				{
					if(items[i].checked)
						alert(items[i].value);
				}
			};
			
			
			//对多选框进行操作
			var checkedAllBox = document.getElementById("checkedAllBox");
			checkedAllBox.onclick=function(){
				var items=document.getElementsByName("items");
				for(var i=0; i<items.length;++i){
					items[i].checked=checkedAllBox.checked;
				}
			};
			
		</script>
		
	</body>
</html>

结果:
js实现多选,全选,反选的功能
效果都是可以实现的,前面的全选只要勾上,下面就会全选,不勾的话,下面就会全不选[可能看起来跟下面的按钮功能有点重叠,但是,这个可以更加方便用户做选择]

据不完全统计:上面的代码。有四五个bug,自己可以一试


bug真的多:上面的复选框勾上了(即全选,下面是会全选的,但是下面全选了,上面的复选框不会自动勾上,下面全选按钮,全不选按钮和反选一些情形是要跟上面的复选框同步的,比如,全部都选上了,然后,反选,这个时候,上面的复选框应该也要不选上,但是反转这里欠缺了好多)

修正了一些bug:例如,下面的按钮与上面的复选框情形不匹配的情况
修正后的代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<style type="text/css">
			#outer{
				margin:0;
				padding:0;
			}
		</style>
		<title></title>
	</head>
	<body>
		<form action="post">
			你爱好的运动是?<input type="checkbox" id="checkedAllBox" />全选/全不选<br/> 
			<input type="checkbox" name="items" value="足球" />足球
			<input type="checkbox" name="items" value="篮球" />篮球
			<input type="checkbox" name="items" value="羽毛球" />羽毛球
			<input type="checkbox" name="items" value="乒乓球" />乒乓球
			<br>
			<input type="button" id="checkAllBtn" value="全选" />
			<input type="button" id="checkNoBtn" value="全不选" />
			<input type="button" id="checkRevBtn" value="反选" />
			<input type="button" id="sendBtn" value="提交" />
		</form>
		
		<script>
			//获取四个多选框
			var items=document.getElementsByName("items");		
			//对多选框进行操作
			var checkedAllBox = document.getElementById("checkedAllBox");
			
			//全选
			var cheakallbtn = document.getElementById("checkAllBtn");
			cheakallbtn.onclick=function(){
				for(var i=0;i<items.length;++i)
				{
					items[i].checked=true;//设置为选中状态
				}
				checkedAllBox.checked=true;//多选框保持与按钮一致
			};

			//全不选
			var cheaknobtn = document.getElementById("checkNoBtn");
			cheaknobtn.onclick=function(){
				for(var i=0;i<items.length;++i)
				{
					items[i].checked=false;//设置为选中状态
				}
				checkedAllBox.checked=false;//多选框保持与按钮一致
			};
			
			//反选
			var checkrevbtn = document.getElementById("checkRevBtn");
			checkrevbtn.onclick=function(){
				for(var i=0;i<items.length;++i)
				{
					items[i].checked= !items[i].checked;
				}
				
				checkedAllBox.checked=true;//先默认为true,下面如果有不行的,再修改,就很妙,目的也是为了与按钮保持一致
					for(var j=0;j<items.length;++j)
					{
						var  count=0;
						//只要一个没选中,就不是全选
						if(!items[j].checked){
							//将checkAllBox设置为false
							checkedAllBox.checked=false;
							break;
						}
					}	
				
				
			};
			
			//提交
			var sendbtn = document.getElementById("sendBtn");
			sendbtn.onclick=function(){
				for(var i=0;i<items.length;++i)
				{
					if(items[i].checked)
						alert(items[i].value);
				}
			};
			

			checkedAllBox.onclick=function(){
				for(var i=0; i<items.length;++i){
					items[i].checked=checkedAllBox.checked;
				}
			};
			
			/*由上往下的状态会改变,但是由下往上的状态不会改变
			 改进:
			 如果四个多选框都选中,则checkedAllBox也应该选上
			 如果四个多选课都没选中,则checkedAllBox也不应该选中*/
			
			//为每一个多选框绑定一个单击函数
			
			for (var i=0;i<items.length;++i) 
			{
				items[i].onclick=function(){
					checkedAllBox.checked=true;//先默认为true,下面如果有不行的,再修改,就很妙,这一行,真的是被震惊到了,太秒了这里
					for(var j=0;j<items.length;++j)
					{
						var  count=0;
						//只要一个没选中,就不是全选
						if(!items[j].checked){
							//将checkAllBox设置为false
							checkedAllBox.checked=false;
							break;
						}
					}	
				};
			}
		</script>
		
	</body>
</html>

到这里,应该算是一个比较完整的代码了,如果有bug,欢迎大家提出来,大家共同学习,共同进步。。。

相关标签: JavaScript