多选框 三级目录 菜单权限 的关联选择功能

实现目标:三级目录菜单分别称为:顶级目录、次级目录、底级目录,实现对各层级目录进行选择操作时,同步影响其他目录的选择状态

具体要求:
1、当顶级目录取消选中时,次级目录和底级目录全部取消选中;
2、当有一个次级目录选中时,其顶级目录也为选中状态;
   当有一个次级目录取消选中时,其底级目录全部取消选中;
   当所有的次级目录都取消选中时,其顶级目录也取消选中;
3、当底级目录选中时,其次级目录和顶级目录也全部选中;

界面效果

html代码部分

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus®">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<style type="text/css">
 .list{ width:300px; border:1px solid #ccc; margin:10px; padding:10px;}
 .sec{ padding-left:20px; margin:10px;}
 .last{ padding-left:20px; margin:10px;}
 .submit{ text-align:center; margin:30px;}
 </style>
<body>
<form name="main" action="check-all-up-post.php" method=post >
  <div class="list">
    <div class="title">-- 顶级目录 <br>
      &nbsp;&nbsp;&nbsp;&nbsp; -- 次级目录 <br>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  -- 底级目录</div>
    <br>
    <div class="top">
      <input type="checkbox" name="T1" value="1" onClick="checkTop('1')" >
      <b>系统使用</b>
      <div class="sec">
        <input type="checkbox" id="p3" name="S1[]" value="3" onClick="checkSec('1',this.id)" >
        系统使用规范
        <div class="last">
          <input type="checkbox" id="p4" name="L1[]" value="4" onClick="checkLast('1',this.id)" >
          添加
          <input type="checkbox" id="p5" name="L1[]" value="5" onClick="checkLast('1',this.id)" >
          删除
          <input type="checkbox" id="p6" name="L1[]" value="6" onClick="checkLast('1',this.id)" >
          编辑 </div>
      </div>
      <div class="sec">
        <input type="checkbox" id="p7" name="S1[]" value="7" onClick="checkSec('1',this.id)" >
        系统使用详情
        <div class="last">
          <input type="checkbox" id="p8" name="L1[]" value="8" onClick="checkLast('1',this.id)" >
          添加
          <input type="checkbox" id="p9" name="L1[]" value="9" onClick="checkLast('1',this.id)" >
          删除
          <input type="checkbox" id="p10" name="L1[]" value="10" onClick="checkLast('1',this.id)" >
          编辑 </div>
      </div>
    </div>
    <div class="top">
      <input type="checkbox" name="T2" value="2" onClick="checkTop('2')" >
      <b>会议资料</b>
      <div class="sec">
        <input type="checkbox" id="p11" name="S2[]" value="11" onClick="checkSec('2',this.id)" >
        会议报告
        <div class="last">
          <input type="checkbox" id="p12" name="L2[]" value="12" onClick="checkLast('2',this.id)" >
          添加
          <input type="checkbox" id="p13" name="L2[]" value="13" onClick="checkLast('2',this.id)" >
          删除
          <input type="checkbox" id="p14" name="L2[]" value="14" onClick="checkLast('2',this.id)" >
          编辑 </div>
      </div>
    </div>
	<div class="submit"><input type="submit" value="确认提交" /></div>
  </div>
</form>
</body>
</html>

js代码部分

<script type="text/javascript">

/*	顶级top目录选择事件
分析:
达成目标:
	顶级目录取消选中时,子级目录同步取消选中;顶级目录选中时,子级目录无操作
实现思路:
	1、保证sec和last目录表单的name值中的数值部分与top表单的name值数值保证一致,用以标记为同一组,可分别记做T1、S1、L1
	2、根据传入的id值,获取当前top目录的表单选中状态
	3、遍历所有元素,根据id值找到当前top下的所有sec和last目录表单并修改选择状态
*/
function checkTop(id){

	//获取当前页面所有元素节点数
	var len = document.main.elements.length;

	//根据当前id值,获取当前top目录选择框的选中状态
	var topchecked = document.all("T"+id).checked;
	//alert(topchecked);
	//遍历所有元素,根据id找出所有当前top目录下的sec和last目录
	for( var i=0;i<len;i++){
		if(document.main.elements[i].name == 'S'+id+'[]' || document.main.elements[i].name == 'L'+id+'[]'){
			if(topchecked == false){
				document.main.elements[i].checked = topchecked;
			}
		}
	}
}


/*	次级sec目录选择事件
分析:
达成目标:
	次级目录有一个选中时,顶级目录同步选中,底级目录无操作;
	当所有次级目录取消选中时,顶级目录同步取消选中,同时底级目录也取消选中
实现思路:
	1、对顶级目录操作。遍历所有元素,如果有1个次级目录是选择状态,则顶级目录也为选中状态,如果所有次级目录都未选中,则顶级目录也为未选中状态
	2、对底级目录操作。当前次级目录如果未选中,则设置其底级目录也为未选中;如当前次级目录为选择状态,其底级目录无操作
*/
function checkSec(id,sid){

	/**********  对底级目录的操作  **********/
	//获取当前节点
	var curNode = document.getElementById(sid);
	
	//通过sid获取当前节点的下一个兄弟节点
	var nextNode = curNode.nextElementSibling;

	//获取该兄弟节点的所有子节点
	var subNode = nextNode.childNodes;

	//遍历所有子节点
	for(var i=0;i<subNode.length;i++){
		//筛选出input节点,并且上级节点状态为未选中时,设置所有子节点状态为未选中
		if(subNode[i].name && curNode.checked==false){
			subNode[i].checked = false;
		}
	}
	
	/***********  对顶级目录的操作  **********/
	//获取当前节点
	var len = document.main.elements.length;

	//alert(len);
	for(var i=0;i<len;i++){
		//遍历元素,找出当前目录的次级目录,并进行下一步操作
		if(document.main.elements[i].name == 'S'+id+'[]'){
			//如果有1个次级目录是选择状态,则顶级目录也为选中状态
			if(document.main.elements[i].checked){
				//设置顶级目录为选中状态
				document.all("T"+id).checked = true;				
				return;
			}
		}
	}
	//如果所有次级目录都未选中,则顶级目录也设置未选中
	document.all("T"+id).checked = false;
}

/*	底级last目录选择事件
*/
function checkLast(id,sid){
	
	/**  对次级目录的处理  **/
	//获取当前节点
	var curNode = document.getElementById(sid);

	//通过当前节点找出上级节点的上一个兄弟节点
	var brotherNode = curNode.parentNode.previousElementSibling;
	//console.log(curNode.checked);

	//如果当前底级目录选择状态为已选中,则设置其上级即次级目录也为选中状态
	if(curNode.checked){
		brotherNode.checked = true;
	}


	/**  对顶级目录的处理  **/	
	//获取当前页面所有元素节点数
	var len = document.main.elements.length;

	for(var i=0;i<len;i++){
		//遍历元素,找出当前底级目录
		if(document.main.elements[i].name == 'L'+id+'[]'){
			//如果有1个底级目录是选择状态,则顶级目录也为选中状态
			if(document.main.elements[i].checked){
				//设置顶级目录为选中状态	
				document.all("T"+id).checked = true;				
				return;
			}
		}
	}
}

</script>

Ps:本次实例是楼主在网上搜寻了一些js代码样例,然后在其基础上结合自己的需求逻辑进行修改的。路过的朋友如果还有更好的实现逻辑及方法,欢迎留言讨论,以求共同进步,谢谢!

猜你喜欢

转载自blog.csdn.net/acvc225/article/details/81129587
今日推荐