使用JQuery检查单击父复选框上的所有直接子复选框

时间:2014-08-06 09:11:29

标签: javascript jquery html checkbox

我的html代码中有一个列表,其中单击父复选框,应检查直接子复选框。

<ul class="test_ex">
    <li>
        <input type="checkbox" id="chckBox" class="parent" onchange="fnTest(this);" /> <a class="ref">Fruits</a>
        <ul class="example">
            <li>
                <input type="checkbox" id="chckBox" class="child" /> <a class="ref"> Apple </a>
            </li>
            <li>
                <input type="checkbox" id="chckBox" class="child" /> <a class="ref"> Orange </a>
            </li>
        </ul>
        <ul class="test_ex_sample">
            <li>
                <input type="checkbox" id="chckBox" class="parent" onchange="fnTest(this);" /> <a class="ref">Birds</a>
                <ul class="example">
                    <li>
                        <input type="checkbox" id="chckBox" class="child" /> <a class="ref"> Peacock </a>
                    </li>
                    <li>
                        <input type="checkbox" id="chckBox" class="child" /> <a class="ref">Parrot </a>
                    </li>
                </ul>
                <ul class="example">
                    <li>
                        <input type="checkbox" id="chckBox" class="parent" onchange="fnTest(this);" /> <a class="ref"> Food </a>
                        <ul class="example">
                            <li>
                                <input type="checkbox" id="chckBox" class="child" /> <a class="ref">Bread </a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

我尝试了很多方法来检查直接的孩子。但它们都没有奏效。 这几种方式:

  • 尝试使用.siblings()[仅在stackoverflow上找到此解决方案]

    function fnTest(check) {
    
      if ($(check).is(':checked')) {
        $(check).siblings('.example').find('.child').attr("checked", true);
      } else {
        $(check).siblings('.example').find('.child').attr("checked", false);
      }
    }
    

Fiddle demo 1

这里第一个列表正常工作。再次单击第二个列表时,它也检查第三个列表子项。

  • 其次尝试了这组代码 尝试使用被检查的类以及从该类中获取子项。这将检查属于该类的所有父母。

Fiddle demo 2

function fnTest(check) {
    if ($(check).is(':checked')) {
        var classParent = "." + $(check).attr('class');
        $(classParent).attr("checked", true);
    }
}

如果有人可以指出我的错误,那就太好了。

4 个答案:

答案 0 :(得分:2)

您可以使用jQuery来完成此操作。首先从父复选框中删除onchange="fnTest(this);"。为父复选框绑定更改事件,如下所示:

$(function(){
   $('.parent').click(function(){
      $(this).parent().find('.example:first .child').prop('checked',$(this).is(':checked'));
   });
 });

<强> Demo

答案 1 :(得分:2)

 function fnTest(check) {
      $(check).closest("ul").find(":checkbox").prop("checked",check.checked);

}

DEMO

如果你只想让直接的孩子这样使用

function fnTest(check) {
    $(check).closest("li").find(".example:first").find(":checkbox").prop("checked", check.checked);

}

DEMO

注意:在jquery中使用最新版本,id也应该是唯一的

答案 2 :(得分:2)

从你第一次尝试使用兄弟姐妹()。您可以更改为以下内容:

function fnTest(check){

    if($(check).is(':checked')){
        $(check).siblings('.example:first').find('.child').prop("checked",true);
    }
    else{
        $(check).siblings('.example:first').find('.child').prop("checked",false);        
    }
      }

通过使用它,它只检查第一个孩子。并将.attr更改为.prop

这是一个演示:Fiddle

答案 3 :(得分:0)

// OK测试

$(document).ready(function(e) {

$('input[type=checkbox]').click(function () {
    $(this).parent().find('li input[type=checkbox]').prop('checked', $(this).is(':checked'));
    var sibs = false;
    $(this).closest('ul').children('li').each(function () {
        if($('input[type=checkbox]', this).is(':checked')) sibs=true;
    })
    $(this).parents('ul').prev().prop('checked', sibs);
});});