jquery实现分级栏目复选框,下拉复选框

本文介绍了一种在网页中实现下拉复选框的方法,通过HTML、CSS和JavaScript(使用jQuery库)来创建一个多级栏目复选框,支持全选、取消全选以及根据子项状态更新父项状态的功能。

下拉复选框

做了一个简单的层级栏目复选框选择,主要功能有:

  • 点击全部选中所有,取消全部取消所有
  • 点击父级选中所有子级,取消父级取消所有子级
  • 取消子级选中,直接和间接父级都取消选中,子级不变
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>模拟实现下拉复选框</title>
		<style>
			.select{
				width: 90%;
				height:100px;
				margin:0px 10px 10px 10px;
				text-align:left;
				border:2px solid #CCCCCC;
				overflow-y:scroll; 
				overflow-x:hidden;
				table-layout: fixed;
				word-wrap:break-word;
				word-break:break-all;
			}
		</style>
		<script src="js/jquery.min1.8.3.js"></script>
		<script src="js/jquery-ui.min1.12.1.js"></script>
		<link rel="stylesheet" href="js/jquery-ui.min1.12.1.css"/>
		<link rel="stylesheet" href="js/jquery-ui.theme.min1.12.1.css"/>
		<script>
			$(function() {
				//栏目权限对话框
				$("#channelDialog").dialog({
					autoOpen: false,
					modal: true,
					width: 280,
					height: 420,
					position: ["center",20],
					buttons: {
						"OK": function() {
							$(this).dialog("close");
						}
					},
					close: function(event, ui) {
						//将列表框中已选中的项复制到隐藏表单中
						var s="";
						$("#channels0"+" input").each(function(){
							if($(this).attr("checked")) {
								s += "<input type='hidden' name='channelIds' value='" +$(this).val()+ "'/>";
							}
						});
					}
				});
				var channels_opened_0 = false;
				$('#channel0').click(function(){
					//第一次打开,需要获取数据。	
					if(!channels_opened_0) {
						//获取数据
						/* $.get("url",{"siteId":1,"userId":1},function(s) {
							$(s).appendTo("#channels0");
						}); */
						channels_opened_0 = true;
					}
					$('#channelDialog').dialog('open');
					return false;
				});	
			});

			function allChannels(chk,i) {
				if(chk) {
						$("#channels"+i+" input").attr("checked",true);
					}else{
						$("#channels"+i+" input").attr("checked",false);
					} 
			}
			
			function f(e){
				//低级栏目下的选中和取消
				if ($(e).attr("checked")) {
					//获取选中的栏目父节点div
					var parent=$(e).parent();
					//获取节点内容
					var content=parent[0].innerHTML;
					//判断级别
					var count=content.split("&nbsp;").length-1;
					while (parent.next()) {
						//获取下一个子栏目
						var nextbrother=parent.next();
						var brothercontent=nextbrother[0].innerHTML;
						var brothercount=brothercontent.split("&nbsp;").length-1;
						//当前栏目的级数在选中栏目的下面,进行选中子栏目
						if (count<brothercount) {
							nextbrother.children().each(function(){
								if(!($(this).attr("checked"))) {
									$(this).attr("checked",true);
								}
							});
						}else {
							break;
						}
						parent=nextbrother;
					}
				}else{
					//获取取消选中的栏目父节点div
					var parent=$(e).parent();
					//获取节点内容
					var content=parent[0].innerHTML;
					//判断级别
					var count=content.split("&nbsp;").length-1;
					while (parent.next()) {
						//获取下一个子栏目
						var nextbrother=parent.next();
						var brothercontent=nextbrother[0].innerHTML;
						var brothercount=brothercontent.split("&nbsp;").length-1;
						//当前栏目的级数在选中栏目的下面,进行取消选中子栏目
						if (count<brothercount) {
							nextbrother.children().each(function(){
								if($(this).attr("checked")) {
									$(this).attr("checked",false);
								}
							});
						}else {
							break;
						}
						parent=nextbrother;
					}
					
					//判断上一级栏目是否还被选中,需要取消,因为子级栏目已经存在没选中的
					parent=$(e).parent();
					while (parent.prev()) {
						//获取上一个子栏目
						var nextbrother=parent.prev();
						var brothercontent=nextbrother[0].innerHTML;
						var brothercount=brothercontent.split("&nbsp;").length-1;
						//当前栏目的父栏目如果还是选中状态,取消选中
						if (count-2==brothercount) {
							nextbrother.children().each(function(){
								if($(this).attr("checked")) {
									$(this).attr("checked",false);
								}
							});
							//继续父级栏目的父级栏目
							count=count-2;
						}
						parent=nextbrother;
					}
					
				}
			}
		</script>
	</head>
	<body>
		<input  id="channel0" type="button" value="弹出下拉复选框"/>
		<div id="channelDialog" style="display:none;">
			<label><input type="checkbox" onclick="allChannels(this.checked,0)" />选择全部</label>
			<div class="select" id="channels0">
				<div><input type="checkbox" value="1" onclick="f(this)" />1</div>
				<div><input type="checkbox" value="2" onclick="f(this)" />&nbsp; &nbsp;2</div>
				<div><input type="checkbox" value="3" onclick="f(this)" />&nbsp; &nbsp;3</div>
				<div><input type="checkbox" value="4" onclick="f(this)" />&nbsp; &nbsp;4</div>
				<div><input type="checkbox" value="5" onclick="f(this)" />&nbsp; &nbsp;&nbsp; &nbsp;5</div>
				<div><input type="checkbox" value="6" onclick="f(this)" />&nbsp; &nbsp;6</div>
			</div>

			<input type="checkbox" value="7" />7
		</div>
	</body>
</html>

效果图:比较简单主要是解决select中无法添加复选框,自己模拟一个,样式可以自己调整:
在这里插入图片描述
改进层级菜单复选框功能:

  • 可以根据子栏目的状态决定父栏目是否选中
  • 上面的功能也保留,这是增强版
  • 没有使用递归,看起来会比较容易,但有很多重复
function f(e){
	//低级栏目下的选中和取消
	if ($(e).attr("checked")) {
		//获取选中的栏目父节点div
		var parent=$(e).parent();
		//获取节点内容
		var content=parent[0].innerHTML;
		//判断级别
		var count=content.split("&nbsp;").length-1;
		while (parent.next()&&parent.next().length>0) {
			//获取下一个子栏目
			let nextbrother=parent.next();
			let brothercontent=nextbrother[0].innerHTML;
			let brothercount=brothercontent.split("&nbsp;").length-1;
			//当前栏目的级数在选中栏目的下面,进行选中子栏目
			if (count<brothercount) {
				nextbrother.children().each(function(){
					if(!($(this).attr("checked"))) {
						$(this).attr("checked",true);
					}
				});
			}else {
				break;
			}
			parent=nextbrother;
		}
		
		//判断上一级栏目是否没被选中,需要选中,因为子级栏目存在选中的
		parent=$(e).parent();
		while (parent.prev() && parent.prev().length>0) {
			//获取上一个子栏目
			let nextbrother=parent.prev();
			let brothercontent=nextbrother[0].innerHTML;
			let brothercount=brothercontent.split("&nbsp;").length-1;
			//当前栏目的父栏目如果不是是选中状态,选中
			if (count-2==brothercount) {
				nextbrother.children().each(function(){
					if(!$(this).attr("checked")) {
						$(this).attr("checked",true);
					}
				});
				//继续父级栏目的父级栏目
				count=count-2;
			}
			parent=nextbrother;
		}
	}else{
		//获取取消选中的栏目父节点div
		var parent=$(e).parent();
		//获取节点内容
		var content=parent[0].innerHTML;
		//判断级别
		var count=content.split("&nbsp;").length-1;
		while (parent.next() && parent.next().length>0) {
			//获取下一个子栏目
			let nextbrother=parent.next();
			let brothercontent=nextbrother[0].innerHTML;
			let brothercount=brothercontent.split("&nbsp;").length-1;
			//当前栏目的级数在选中栏目的下面,进行取消选中子栏目
			if (count<brothercount) {
				nextbrother.children().each(function(){
					if($(this).attr("checked")) {
						$(this).attr("checked",false);
					}
				});
			}else {
				break;
			}
			parent=nextbrother;
		}
		
		//判断当前栏目中有没有选中的,没有取消父级栏目选中
		parent=$(e).parent();
		while (parent.prev() && parent.prev().length>0) {
			//获取上一个子栏目
			let nextbrother=parent.prev();
			let brothercontent=nextbrother[0].innerHTML;
			let brothercount=brothercontent.split("&nbsp;").length-1;
			//当前栏目的父栏目如果是选中状态,选中判断子栏目中是否存在选中的,不存在取消选中
			if (count-2==brothercount) {
				nextbrother.children().each(function(){
					if($(this).attr("checked")) {
						//是否存在选中的判断符
						let isCheck=false;
						let parentchilrden=nextbrother;
						let countchildren=count-2;
						while (parentchilrden.next() && parentchilrden.next().length>0){
							//获取下一个子栏目
							let nextbrotherchildren=parentchilrden.next();
							if (nextbrotherchildren[0]==null) {
								break;
							}
							let brothercontentchildren=nextbrotherchildren[0].innerHTML;
							let brothercountchildren=brothercontentchildren.split("&nbsp;").length-1;
							//当前栏目的级数在选中栏目的下面,进行取消选中子栏目
							if (countchildren<brothercountchildren) {
								nextbrotherchildren.children().each(function(){
									if($(this).attr("checked")) {
										isCheck=true;
										//break;
									}
								});
							}else {
								break;
							}
							parentchilrden=nextbrotherchildren;
						}
						if (isCheck) {
							$(this).attr("checked",true);
						}else{
							$(this).attr("checked",false);
						}	
					}
				});
				//继续父级栏目的父级栏目
				count=count-2;
			}
			parent=nextbrother;
		} 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值