利用checkbox自带属性indeterminate构建含部分选中状态的树状结构

本来上个月就像发的,但是一直忙啊忙的也没时间整理,所以拖到了现在。

好吧上面这句就是废话,我就是感概下。下面是正文。

前段时间在弄一个轻量级的web项目,要构建一个树状结构目录,同时希望能把部分选中的状态给表现出来。项目中只用了jquery,个人也不想再引入一些其他的js框架或者插件,一个是考虑到界面展示的样式效果会不一样,另外就是懒得去研究啦。

话不多说,直接上测试图片和代码。

Ps:我代码里还含有一些设置css以及属性等代码,需要参考的朋友请自动忽略。博文结尾处有我当时找到参考的外国网站上的原文链接。

/* 监听checkbox选择事件,勾选时自动勾选上下级选项 */
    $("#select-tree-org").on("click", "input[type=‘checkbox‘]", function() {
        var checked = $(this).prop("checked"),
            container = $(this).parent();

        container.find(‘input[type="checkbox"]‘).prop({
            indeterminate: false,
            checked: checked
        }).removeClass(‘indeterminate‘);

        function checkSiblings(el) {
            var parent = el.parent().parent(),
                all = true;

            el.siblings().each(function() {
                return all = ($(this).children(‘input[type="checkbox"]‘).prop("checked") === checked);
            });

            if (all && checked) {

                parent.children(‘input[type="checkbox"]‘).prop({
                    indeterminate: false,
                    checked: checked
                }).removeClass(‘indeterminate‘);

                checkSiblings(parent);
            } else if (all && !checked) {

                parent.children(‘input[type="checkbox"]‘).prop("checked", checked).removeClass(‘indeterminate‘);
                parent.children(‘input[type="checkbox"]‘).prop("indeterminate", (parent.find(‘input[type="checkbox"]:checked‘).length > 0));
                checkSiblings(parent);

            } else {

                el.parents("li").children(‘input[type="checkbox"]‘).prop({
                    indeterminate: true,
                    checked: false
                }).addClass(‘indeterminate‘);

            }

        }

        checkSiblings(container);
    });

原文博主中有测试代码及链接:https://css-tricks.com/indeterminate-checkboxes/

时间: 2024-10-15 11:51:15

利用checkbox自带属性indeterminate构建含部分选中状态的树状结构的相关文章

【ExtJs】利用树状结构、Border布局与标签页刻划OA界面

之前说ExtJs是最适合做OA界面的前端框架,因为它把客户端界面搬来了网页,这东西可以说是,就是为那些各种各样的OA信息系统而生的. 一.基本目标 做出如下的OA界面,点击左边的项可以打开相应的标签页,点击标签页的关闭按钮可以关闭这个标签页,在下方的操作信息栏记录相应的操作. 树状结构可以折叠,可以调整.操作信息可以节点. 搞出这样的结构,就是从小的方面研究ExtJs的其它UI组件与Ajax系统,再配合php,aspx或者jsp等后端语言,就可以去OA系统开黑了,或者,一个不爽,标签页里面的系统

CheckBox属性-Indeterminate状态

很早在QQ邮箱见到过这种效果,但一直不知其原理,最近网上查阅资料,才知道这是checkbox的一个属性. <input id="check" type="checkbox"> var Check = document.getElementById('check'); Check.indeterminate = true; 如代码中所示,Indeterminate属性并不能在元素中直接使用,而是需用JS控制. 有趣的是,在Firefox浏览器中,Indet

用NHibernate处理带属性的多对多关系

1.引言 老谭在面试开发人员的时候,为了考察他们的数据库开发能力,常常祭出我的法宝,就是大学数据库教程中讲到的一个模式:学生选课.这个模式是这样的: 在这个模式中,学生(Student)和课程(Course)都是实体,分别有主键Id.考试成绩(Score)是学生和课程之间的多对多关系. 基于这个模式,对于新手,可以出一些简单查询要求,对于熟手,可以出一些复杂的查询要求,用起来得心应手. 但今天要说的重点是,怎么用NHibernate实现这个模式.和一般多对多关系稍有不同的是,这个关系带有一个属性

利用checkbox的到值,并且存到数据库修改的话要显示之前选择的

在前台当然是利用checkbox来得到复选框的语言:{% for language in languages%}<input type="checkbox" name="language" value='{{ language.id }}' >{{ language.name }}{% endfor %}而复选框如果是已经选的在前台就展示的是选择的,那么input的属性就应该有checked 那么就可以通过在前台if来判断language.id跟已经选择

[转]利用C#自带组件强壮程序日志

利用C#自带组件强壮程序日志 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工作的 具体实现可以自由发挥~~~~ 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的

MFC 利用checkbox 做成切换开关按钮

我们在做MFC程序时候经常会一个切换式的按钮,之前我的做法是利用buttion类的一个SetState()函数,但是返现效果不佳.而且容易出现点1按钮,焦点跑到另外一个按钮上去了  .后来看到别人一个程序.我发现他的切换效果做的很好 ,经过看代码发现,他用的控件根本不是buttion控件而是check box 控件.我就很奇怪,如何将check box变成了一个按钮的,经查看代码发现,原来是他将控件的属性------push lisk  (我的翻译是按下去像  纯字面理解)设置成true  如图

点击tr实现选择checkbox功能,点击checkobx的时候阻止冒泡事件, jquery给checkbox添加checked属性或去掉checked属性不能使checkobx改变状态

给tr添加点击事件,使用find方法查找tr下的所有层级的元素,children只查找下一层级的元素,所以使用find.find的返回值为jquery对象,在这个项目中不知道为什么使用jquery给checkbox添加checked属性或去掉checked属性不能使checkobx改变状态,所以我就把jquery对象转换为DOM对象,怎么转呢?jquery对象[0]或者get(0)就转换成DOM对象,然后直接.checked返回true或false就可以判断checkbox是否选中了.然后判断状

checkbox的checked属性问题

在设置checked时,如 $("#checkbox").attr("checked",true); 页面显示checked属性已添加,但是未被选中(没打勾), 在如下代码中没有问题: function tree_item_checked(cl,type){     if($("#item_"+cl).is(":checked")) {         $("input[key='tree_item_checkbox

jQuery把所有被选中的checkbox的某个属性值连接成字符串

有这样的一个需求:对于一组checkbox,当点击每个checkbox后,把当前处于选中状态的checkbox的某个属性值取出来连接成字符串,并以逗号分开. html部分: <input type="checkbox" id="1"/> <label for="1">选项一</label> <br/> <input type="checkbox" id="2&qu