`

CheckBox级联选择

阅读更多

最近做项目时,需要用到CheckBox的级联选择,于是自己动手写了一个。

 

这个CheckBox的级联选择是用纯JavaScript编写的,没有借助其他的JS框架。

 

希望能够对大家有用,同时希望大家多多指出代码中的不足!

 

(注:新上传了跨浏览器的版本。特别感谢“02221021”兄的帮助!)

 

以下是JS代码(附件中可以看效果):

	//判断所有的checkbox的选中状态
	//@id : checkbox的id
	function checkedStatus(id){

		//获取checkbox
		var temp = document.getElementById(id);
		
		//设置checkbox的下级checkbox的状态
		setChildCheckBox(temp);

		//设置checkbox的上级checkbox的状态
		setParentCheckBox(temp);
	}

	//获取checkbox的下级checkbox信息
	//@entity : checkbox的DOM对象
	function findChildCheckBox(entity){

		//存放下级checkbox的数组
		var chkArray = new Array();

		//判断是否有input标签
		if(document.getElementsByTagName("input")){

			//获取所有的input标签
			var inputs = document.getElementsByTagName("input");

			//遍历input标签,获取下级checkbox
			for(var i = 0; i < inputs.length; i++){
				var ele = inputs[i];

				//判断type是“checkbox”,并且checkbox的parentId等于entity的id
				if(ele.type == "checkbox" && ele.parentId == entity.id){
					chkArray.push(ele);
				}
			}
		}
		return chkArray;
	}

	//获取checkbox的同级checkbox信息
	//@entity : checkbox的DOM对象
	function findBrotherCheckBox(entity){

		//存放同级checkbox的数组
		var chkArray = new Array();

		//判断是否有input标签
		if(document.getElementsByTagName("input")){

			//获取所有的input标签
			var inputs = document.getElementsByTagName("input");

			//遍历input标签,获取同级checkbox
			for(var i = 0; i < inputs.length; i++){
				var ele = inputs[i];

				//判断type是“checkbox”,并且checkbox的parentId等于entity的parentId
				if(ele.type == "checkbox" && ele.parentId == entity.parentId){
					chkArray.push(ele);
				}
			}
		}
		return chkArray;
	}

	//获取checkbox的上级checkbox信息
	//@entity : checkbox的DOM对象
	function findParentCheckBox(entity){

		//存放上级checkbox的对象
		var _element = null;

		//判断是否有input标签
		if(document.getElementsByTagName("input")){

			//获取所有的input标签
			var inputs = document.getElementsByTagName("input");

			//遍历input标签,获取上级checkbox
			for(var i = 0; i < inputs.length; i++){
				var ele = inputs[i];

				//判断type是“checkbox”,并且checkbox的id等于entity的parentId
				if(ele.type == "checkbox" && ele.id == entity.parentId){
					_element = ele;
					break;
				}
			}
		}
		return _element;
	}

	//设置checkbox的下级checkbox的状态
	//@entity : checkbox的DOM对象
	function setChildCheckBox(entity){

		//entity的选中状态
		var status = entity.checked;

		//获取entity的下级checkbox
		var childList = findChildCheckBox(entity);

		//判断是否有下级
		if(childList.length > 0){

			//遍历下级checkbox,并设置状态
			for(var i = 0; i < childList.length; i++){
				childList[i].checked = status;

				//设置childList[i]的下级checkbox的状态
				setChildCheckBox(childList[i]);
			}
		}
	}

	//设置checkbox的上级checkbox的状态
	//@entity : checkbox的DOM对象
	function setParentCheckBox(entity){

		//entity的上级checkbox的选中状态
		var parentChecked = true;

		//获取entity的上级checkbox
		var parentCheckBox = findParentCheckBox(entity);

		//判断是否有上级
		if(parentCheckBox){

			//获取entity的同级checkbox
			var brotherList = findBrotherCheckBox(entity);

			//判断是否有同级
			if(brotherList.length > 0){
				
				//遍历同级checkbox
				for(var i = 0; i < brotherList.length; i++){

					//如果同级的checkbox有未选中的状态,则设置上级的checkbox的状态为false
					if(brotherList[i].checked == false){
						parentChecked = false;
						break;
					}
				}
			}

			//设置上级checkbox的选中状态
			parentCheckBox.checked = parentChecked;

			//设置parentCheckbox的上级checkbox的状态
			setParentCheckBox(parentCheckBox);
		}
	}

 效果如下:


  • 大小: 6.6 KB
分享到:
评论
25 楼 cailinzheng 2010-06-23  
这帖子不错
24 楼 cuixiping 2009-08-06  
一个checkbox应该要有3种状态:全选、半选、未选。通常安装程序里头的选择就是这个样子的啊。

要有半选功能,就不是<input type=checkbox>能搞定的了,必须要模拟。

另外呢,如果有disabled了,那么它的状态应该要不被其它checkbox的点击所改变。
23 楼 mx122723 2009-07-30  
这个js通用吗?
22 楼 lib 2009-07-28  
<div class="quote_title">windywany 写道</div>
<div class="quote_div">写个JQUERY插件吧.实现起来不会这么苯重.</div>
<p> </p>
<p>现在天天使用JQuery,都快忘了Dom的操作了<img src="/images/smiles/icon_redface.gif" alt="">。</p>
<p> </p>
<p>所以就自己写了一个。</p>
<p> </p>
21 楼 windywany 2009-07-28  
写个JQUERY插件吧.实现起来不会这么苯重.
20 楼 sxpyrgz 2009-07-25  
<pre name="code" class="java">
&lt;div &gt;
&lt;div &gt;
&lt;div  id ="one"&gt;&lt;input name = "" value ="oneChild" type="checkbox"  onclick = "checkChild(this,'oneChild')"&gt;one&lt;/div&gt;
&lt;div id = 'oneChild'&gt;

&lt;ul&gt;
&lt;li&gt;&lt;div&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'one')"&gt;one1
   &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'one')"&gt;one2&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'one')"&gt;one3&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'one')"&gt;one4&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div &gt;
&lt;div &gt;
&lt;div  id ="two" &gt;&lt;input name = "" value ="twoChild" type="checkbox" onclick = "checkChild(this,'twoChild')"&gt;two&lt;/div&gt;
&lt;div id ="twoChild"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'two')"&gt;two1&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'two')"&gt;two2&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'two')"&gt;two3&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'two')"&gt;two4&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div &gt;
&lt;div &gt;
&lt;div id ="three"&gt;&lt;input name = "" value ="threeChild" type="checkbox"  onclick = "checkChild(this,'threeChild')" &gt;three&lt;/div&gt;
&lt;div id="threeChild"&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'three')"&gt;three1&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'three')"&gt;three2&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'three')"&gt;three3&lt;/li&gt;
&lt;li&gt;&lt;input name = "" type="checkbox"  onclick = "checkParent(this,'three')"&gt;three4&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div &gt;
&lt;/div&gt;

&lt;script language="javascript"&gt;
function checkChild(obj,childId){
var childs    = document.getElementById(childId);
var subChecks = childs.getElementsByTagName("input");
if(obj.checked){
for(var i = 0 ;i&lt; subChecks.length;i++){
subChecks[i].checked=true;
}
}else{
for(var i = 0 ;i&lt; subChecks.length;i++){
subChecks[i].checked = false;
}
}
}
function checkParent(obj,parentId){
var parent = document.getElementById(parentId);
if(obj.checked){
parent.getElementsByTagName("input")[0].checked = true;
}else{
var flag   = false;
var childs = parent.nextSibling;
var subChecks = childs.getElementsByTagName("input");
for(var i =0 ;i&lt;subChecks.length;i++){
var temp = subChecks[i];
if(temp.checked==true){
flag = true;
}
}
if(flag){
parent.getElementsByTagName("input")[0].checked = true;
}else{
parent.getElementsByTagName("input")[0].checked = false;
}
}
}
&lt;/script&gt;
给你写个简单点儿的!参考一下,呵呵!!</pre>
<p> <br></p>
<p> </p>
19 楼 lib 2009-07-25  
<div class="quote_title">momo_1204 写道</div>
<div class="quote_div">
<div class="quote_title">lib 写道</div>
<div class="quote_div">
<div class="quote_title">jltest 写道</div>
<div class="quote_div">使用jquery读自定义属性。<br>
</div>
<p> </p>
<p>楼上的理解错误了。即使不使用jQuery也可以读取自定属性的,(对象.属性名称)即可。</p>
<p> </p>
<p>我的问题是:自定义属性在其他的浏览器中不支持,在不借助其他JS框架的情况下,应如何实现?</p>
</div>
<p><br>将要使用的属性放到style属性里啊,比如文本框数据格式校验必须为数字,那么在style里添加一个inNum:Y;  别的也可以类似的吧,呵呵,仅供参考</p>
</div>
<p> </p>
<p>这个还真没有想到。应该是个不错的办法。不用使用自定义属性了。谢谢!!</p>
18 楼 lib 2009-07-25  
<div class="quote_title">sxpyrgz 写道</div>
<div class="quote_div">哥们儿这个设计好象设计不太好,用上DIV那效果会更好的!CHECKBOX选择上也会更好的!</div>
<p> </p>
<p>你说的是在checkbox外面用div包裹?</p>
<p> </p>
<p>使用&lt;label&gt;也可以达到这个效果。</p>
17 楼 lib 2009-07-25  
<div class="quote_title">lsqwind 写道</div>
<div class="quote_div">不能点击子节点checkBox 选中它的所有的父节点? 以前写过一个用了递归,效率很慢的说.<br>LZ有啥好办法. 选中父节点时下边的所有子节点都选中,选中子节点上边的所有父节点都选中</div>
<p> </p>
<p>除了递归外,我也想不出什么好的办法<img src="/images/smiles/icon_redface.gif" alt="">。我的这个例子就是用的递归做的。</p>
<p> </p>
<p>如果在这个例子上面加上“选中子节点,其所有的父节点都选中”这个功能,就会很乱的。</p>
16 楼 momo_1204 2009-07-24  
<div class="quote_title">lib 写道</div>
<div class="quote_div">
<div class="quote_title">jltest 写道</div>
<div class="quote_div">使用jquery读自定义属性。<br>
</div>
<p> </p>
<p>楼上的理解错误了。即使不使用jQuery也可以读取自定属性的,(对象.属性名称)即可。</p>
<p> </p>
<p>我的问题是:自定义属性在其他的浏览器中不支持,在不借助其他JS框架的情况下,应如何实现?</p>
</div>
<p><br>将要使用的属性放到style属性里啊,比如文本框数据格式校验必须为数字,那么在style里添加一个inNum:Y;  别的也可以类似的吧,呵呵,仅供参考</p>
15 楼 sxpyrgz 2009-07-24  
哥们儿这个设计好象设计不太好,用上DIV那效果会更好的!CHECKBOX选择上也会更好的!
14 楼 lib 2009-07-24  
<div class="quote_title">whaosoft 写道</div>
<div class="quote_div">如果 需要级联的 checkbox要是 动态 行里出来的  所有子的跟最外面的主的级联 但能改变 那个好做吗</div>
<p> </p>
<p>能不能说的具体一些?我不是太明白你要实现的功能<img src="/images/smiles/icon_redface.gif" alt="">。</p>
13 楼 lsqwind 2009-07-23  
不能点击子节点checkBox 选中它的所有的父节点? 以前写过一个用了递归,效率很慢的说.
LZ有啥好办法. 选中父节点时下边的所有子节点都选中,选中子节点上边的所有父节点都选中
12 楼 whaosoft 2009-07-23  
如果 需要级联的 checkbox要是 动态 行里出来的  所有子的跟最外面的主的级联 但能改变 那个好做吗
11 楼 風一樣的男子 2009-07-22  
跨浏览器版本 IE6 下不行
10 楼 lib 2009-07-22  
<div class="quote_title">tkl211 写道</div>
<div class="quote_div">
<div class="quote_title">lib 写道</div>
<div class="quote_div">最新上传了跨浏览器版本!!</div>
<br>跨浏览的在IE下,竟然不行... <img src="/images/smiles/icon_redface.gif" alt=""><br>
</div>
<p> </p>
<p>我在IE7、Firefox3.0、Oper9、Safari4、Chrome都测试过了,可以的。</p>
<p> </p>
<p>是不是IE6的问题?我再看一下。</p>
9 楼 tkl211 2009-07-22  
lib 写道
最新上传了跨浏览器版本!!

跨浏览的在IE下,竟然不行... 
8 楼 Jwind 2009-07-21  
很简单,能写点更实用就好了。
7 楼 lib 2009-07-21  
最新上传了跨浏览器版本!!
6 楼 lib 2009-07-21  
<div class="quote_title">02221021 写道</div>
<div class="quote_div">.setAttribute(key, value)<br>.getAttribute(key)</div>
<p> </p>
<p>谢谢提醒。等这几天忙完工作,会修改后,上传一份新的代码。</p>

相关推荐

Global site tag (gtag.js) - Google Analytics