下拉复选框
做了一个简单的层级栏目复选框选择,主要功能有:
- 点击全部选中所有,取消全部取消所有
- 点击父级选中所有子级,取消父级取消所有子级
- 取消子级选中,直接和间接父级都取消选中,子级不变
<!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(" ").length-1;
while (parent.next()) {
//获取下一个子栏目
var nextbrother=parent.next();
var brothercontent=nextbrother[0].innerHTML;
var brothercount=brothercontent.split(" ").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(" ").length-1;
while (parent.next()) {
//获取下一个子栏目
var nextbrother=parent.next();
var brothercontent=nextbrother[0].innerHTML;
var brothercount=brothercontent.split(" ").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(" ").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)" /> 2</div>
<div><input type="checkbox" value="3" onclick="f(this)" /> 3</div>
<div><input type="checkbox" value="4" onclick="f(this)" /> 4</div>
<div><input type="checkbox" value="5" onclick="f(this)" /> 5</div>
<div><input type="checkbox" value="6" onclick="f(this)" /> 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(" ").length-1;
while (parent.next()&&parent.next().length>0) {
//获取下一个子栏目
let nextbrother=parent.next();
let brothercontent=nextbrother[0].innerHTML;
let brothercount=brothercontent.split(" ").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(" ").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(" ").length-1;
while (parent.next() && parent.next().length>0) {
//获取下一个子栏目
let nextbrother=parent.next();
let brothercontent=nextbrother[0].innerHTML;
let brothercount=brothercontent.split(" ").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(" ").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(" ").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;
}
}
}
本文介绍了一种在网页中实现下拉复选框的方法,通过HTML、CSS和JavaScript(使用jQuery库)来创建一个多级栏目复选框,支持全选、取消全选以及根据子项状态更新父项状态的功能。
4860

被折叠的 条评论
为什么被折叠?



