`
lib
  • 浏览: 135651 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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>

相关推荐

    C#树形菜单的CheckBox级联选择

    实现树形菜单的CheckBox级联选择功能是增强用户交互性的重要手段,它允许用户通过选择一个节点来自动选中或取消选中其所有子节点,以及可能的父节点。这个特性通常在多级选择场景中非常有用。 首先,我们要理解`...

    js实现checkbox级联选择

    使用javascript实现checkbox级联选择

    jQuery实现的checkbox级联选择下拉菜单效果示例

    本文实例讲述了jQuery实现的checkbox级联选择下拉菜单效果。分享给大家供大家参考,具体如下: &lt;html&gt; &lt;head&gt; &lt;meta http-equiv=Content-Type content=text/html; charset=utf-8&gt; &lt;title&gt;&...

    flex tree+checkbox级联勾选

    "Flex Tree + Checkbox级联勾选"是一个重要的功能点,通常出现在数据管理、配置界面或文件管理系统中,允许用户进行批量选择或级联操作。 首先,我们来详细了解一下Flex Tree。Flex Tree是基于Adobe Flex技术的一种...

    带CheckBox和级联操作的Tree

    带CheckBox和级联操作的Tree 带CheckBox和级联操作的Tree 带CheckBox和级联操作的Tree

    纯JS+HTML写的checkBox Tree 级联选中 好用无BUG

    在前端开发中,CheckBox Tree(复选框树)是一种常见的组件,用于展示具有层级关系的数据,并支持用户进行多级选择。这个"纯JS+HTML写的checkBox Tree 级联选中"实例,解决了其他示例中可能存在的BUG,提供了一个...

    ExtJS4.2 tree 级联选择

    ExtJS4.2 Tree 级联选择是一个用于构建用户界面的功能,特别是在处理层次结构数据时非常有用。在ExtJS库中,Tree组件允许我们展示和操作数据以树形结构显示,而级联选择功能则意味着当用户选择一个节点时,它的所有...

    checkbox 用shift键 级联选择

    "checkbox 用shift键 级联选择"这个话题涉及到一种提高用户效率的交互设计,它允许用户通过按下Shift键快速选择一系列连续的复选框(checkboxes)。在网页或应用程序中,复选框通常用于让用户在多个选项中进行多选。...

    Ext TreePanelrcheckbox级联选择的实现

    在实际应用中,我们经常需要处理树形结构的复选框,实现级联选择功能,即当父节点被选中时,其所有子节点自动被选中,反之亦然。这篇博客“Ext TreePanelrcheckbox级联选择的实现”就专注于探讨这个主题。 首先,...

    CheckBox 级联例子

    这个例子可实现二级联动 比如:口1.xxxx 口xxx 口xxx 口xxx 选中1.xxxx时,会自动将其对应的3个子项选中.

    CheckBox分级选中 复选框 上下级 联动

    在IT行业中,尤其是在前端开发领域,"CheckBox分级选中 复选框 上下级 联动"是一个常见的功能需求,通常应用于具有层级结构的数据展示和交互场景,比如树形菜单、组织架构选择等。这个功能的核心是实现复选框...

    Uniapp 表单组件 多层选择 开关 评分 滑块 步进器 日期框 级联选择 下拉列表 复选框 单选框 多行文本 单行文本

    多层选择 开关 评分 滑块 步进器 日期框 级联选择 下拉列表 复选框 单选框 多行文本 单行文本 textarea radio checkbox picker stepper input ,引用组件或者复制粘贴使用,提高工作效率。

    带有checkbox的TREE列表级联的选择子栏目的JAVA标签形式的实现

    本文将详细讲解如何实现一个带有复选框(Checkbox)的树形列表(TREE LIST)的级联选择功能,以及相关的Java标签形式实现。这种功能常见于权限管理、组织结构选择等场景,让用户能够方便地进行多层级的勾选操作。 ...

    js多级联动多选checkbox插件

    4. **级联逻辑**:当用户选择或取消选择一个节点时,需要更新其所有子节点的状态。这可能涉及到递归遍历数据结构,并根据父节点的选中状态来设置子节点的选中状态。 5. **UI更新**:在状态改变后,需要同步更新UI。...

    select三级级联选择实例

    一个简单html页面,实现省市的三级级联选择,根据不同情况可以控制不同展现。

    ExpandAbleListView+checkbox数组方式级联,点击选择顶部文本显示,可删除

    ExpandAbleListView+checkbox数组方式级联,外层列表可展开收起,内层列表使用checkbox多选框,点击之后可在顶部的gridlayout显示,顶部显示的选中与checkbox选中状态关联,点击顶部选中的item,可取消选中状态,...

    js实现TreeView 级联选择

    ### js实现TreeView 级联选择 在前端开发中,TreeView 控件是非常常见的一个功能组件,主要用于展示层次化的数据结构。而级联选择是指当用户选择一个节点时,该节点的所有子节点也会自动被选中(全选)或取消选中...

    Ext 树的级联选择扩展插件使用说明

    这个插件可能包含了对原有Tree节点UI的扩展,添加了复选框(Checkbox)以便用户进行选择操作,并且包含了级联选择的逻辑,确保了父子节点之间的状态同步。 使用这个扩展插件通常包括以下几个步骤: 1. 引入`...

    Flex tree+checkbox可实现级联勾选 修改

    flex tree+checkbox可实现级联勾选 修改后 修改CheckTreeDemoRenderer.as这个文件中 while (!cursor.afterLast){ if (cursor.current.@state == STATE_CHECKED) { noChecks++; }else if (cursor.current.@state =...

Global site tag (gtag.js) - Google Analytics