如果在JQuery中取消选中所有子项,请取消选中父节点

时间:2011-07-02 10:27:09

标签: jquery

如果未选中所有子项,我想取消选中父节点。

<ul id="treeList">
   <li>
   <input type="checkbox" name="selectedRole">
   Application Manager
    <ul>
       <li>
           <input type="checkbox" name="selectedRole">
           Application Manager Panel
       </li>
       <li>
            <input type="checkbox" name="selectedRole">
            Client Role
             <ul>
               <li>
                   <input type="checkbox" name="selectedRole">
                   Client Task 1
                </li>
                <li>
                   <input type="checkbox" name="selectedRole">
                    Client Task 2
                </li>
                 </ul>
              </li>
           </ul>
       </li>

我有以下jQuery脚本。但是,当我取消选中任何一个孩子时,父母都取消了。它应该看,如果所有的孩子都没有被检查。那么它应该取消选中父母。

jQuery.each(jQuery('#treeList ul li').find(':checkbox'),  function(){
    jQuery(this).change(function (){
        if (jQuery(this).is(':checked')) {
            jQuery(this).parents('ul').siblings('input:checkbox').attr('checked', true);
        }else{
            jQuery(this).parents('ul').siblings('input:checkbox').attr('checked', false);
        }        
    });    
});

2 个答案:

答案 0 :(得分:3)

每次取消选中子项时,您都会取消选中父li复选框,而不是检查是否还有其他已检查项。相反,您可以检查项目数checked并将length用作boolean

jQuery.each(jQuery('#treeList ul li').find(':checkbox'),  function(){
    jQuery(this).change(function (){
        if (jQuery(this).is(':checked')) {
                      jQuery(this).parentsUntil('#treeList').siblings().filter('input:checkbox').attr('checked', true).trigger('change');
        }else{                
            jQuery(this).parents('ul:first').siblings('input:checkbox').prop('checked', $(this).parent().siblings().children('input:checked').length).trigger('change');
        }        
    });    
});

示例:http://jsfiddle.net/niklasvh/fRxVs/

这是你的小提琴的更新版本...添加了一些CSS来澄清树级别(父母和子女关系)http://jsfiddle.net/vimalpatel/fRxVs/440/

答案 1 :(得分:1)

你有:

$("#treeList :checkbox").change(function(){
         uncheckParentIfSiblingsUnchecked($(this));
      });
      function uncheckParentIfSiblingsUnchecked($chk){
         if($chk.size() == 1 && !$chk.is(":checked")){
            $checked_siblings = $chk.closest("ul").children("li").children(":checkbox:checked");
            if($checked_siblings.size() == 0){
                 $parent_checkbox = $chk.closest("ul").prev(":checkbox").attr("checked", false);
                 uncheckParentIfSiblingsUnchecked($parent_checkbox);
            }
         }
      }

这是递归的,因为它必须“冒泡”到根复选框。 希望这可以帮助。干杯