选中/取消选中父母和孩子

Posted

技术标签:

【中文标题】选中/取消选中父母和孩子【英文标题】:Check/uncheck parents and children 【发布时间】:2010-09-14 14:03:02 【问题描述】:

你能写出更好的代码吗?我需要根据父母检查/取消选中所有孩子,当检查孩子时,检查父母,当所有孩子都未选中时,取消选中父母。

    $(".parent").children("input").click(function() 
    $(this).parent().siblings("input").attr("checked", this.checked);
);

$(".parent").siblings("input").click(function() 
    if (this.checked) 
        $(this).siblings("div").children("input").attr("checked", true);
        return;
    

    var childs = $(this).siblings("div").siblings("input");

    for (i = 0; i < childs.length; i++) 
        if ($(childs.get(i)).attr("checked"))
            return;
    

    $(this).parent().children("div").children("input").attr("checked", false);
);

【问题讨论】:

【参考方案1】:
$(".parent").children("input").click(function() 
    $(this).parent().siblings("input").attr("checked", this.checked);
);

$(".parent").siblings("input").click(function() 
    $(this).siblings("div").children("input").attr("checked",
        this.checked || $(this).siblings("input[checked]").length>0
    );
);

【讨论】:

做“.siblings(...).siblings(...)”有什么意义?另外:“$(this).parent().children(...)”可能只是“.siblings(...)” nickf: 哎呀,看看你有没有注意 :) - 实际上,我只是从 Zote 的代码(var childs line)中复制了它 - 我已经清理了更多(+1)跨度> 【参考方案2】:

哇,我很困惑。看起来好像您在其中有其他输入的输入? ......这没有意义。这是我认为你的结构的样子,所以我开始了。

<div class="parent">
    <input type="checkbox" />
    <div>
        <input type="checkbox" />
        <input type="checkbox" />
    </div>
    <input type="checkbox" />
    <div>
        <input type="checkbox" />
        <input type="checkbox" />
    </div>
</div>

这是我要使用的代码。

$("input[type='checkbox']").click(function() 
    // turn on or off all descendants.
    $(this)         // get this checkbox
        // get the div directly after it
        .next('div')
        // get ALL the inputs in that div (not just first level children)
        .find("input[type='checkbox']")
        .attr("checked", this.checked)
    ;

    // now check if we have to turn the parent on or off.
    $(this)
        .parent()  // this will be the div
        .prev('input[type="checkbox"]')  // this is the input
        .attr(
            "checked",     // set checked to true if...
            this.checked   // this one is checked, or...
            || $(this).siblings("input[type='checkbox'][checked]").length > 0
                           // any of the siblings are checked.
        )
    ;
);

更新:我刚刚对此进行了测试,它完全有效(哇!)。它还可以根据需要使用任意多级的嵌套,而不仅仅是两级。

【讨论】:

【参考方案3】:

这是一个可爱的小线程,它让我几乎到达了我需要的地方。我稍微修改了 Nickf 的代码。目的是检查孩子也会检查父母,取消检查父母也会取消检查所有孩子。

$("input[type='checkbox']").click(function() if (!$(this.checked))

$(this) 
    .next('div')
    .find("input[type='checkbox']")
    .attr("checked", this.checked)
;



$(this)
    .parent()  
    .prev('input[type="checkbox"]')  
    .attr("checked", this.checked || $(this).siblings("input[type='checkbox'][checked]").length > 0

    )
;

);

如果父项未选中,如何进行调整以使所有后代均未选中?

JQ 和 javascript..道歉。

【讨论】:

【参考方案4】:
$('.parent').click(function()
    checkBox = $(this).find('input[type=checkbox]');
    checkBox.prop("checked", !checkBox.prop("checked")); // inverse selection
);

终极。

【讨论】:

以上是关于选中/取消选中父母和孩子的主要内容,如果未能解决你的问题,请参考以下文章

怎么取消选中的checkbox?

checkbox选中\取消

使用 jquery 选中或取消选中 parent parents 复选框

选中和取消选中 Qt 上的 QRadioButton 颜色更改

js写全选,怎么取消一个checkbox的选中状态,让全选的checkbox选中状态取消

复选框 - 使用 jQuery 和 MySQL 选中或取消选中