如果在JQuery中所有子节点都未选中,则取消选中父节点

3
如果所有的子节点都没有被选中,我希望取消选中父节点。
<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个回答

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/

这里是你的fiddle更新版本... 添加了一些CSS来说明树级(父子关系)http://jsfiddle.net/vimalpatel/fRxVs/440/


抱歉,它不起作用。如果我有另一个节点,比如客户端角色,并且它还可以有2个客户端任务。对此有什么提示吗?因为它在客户端角色的同级节点上不起作用。 - Tahir
@Tahir Akram 对代码进行了小更新,现在应该可以正常工作了。 - Niklas
A). 检查客户端任务2(最后一个节点) B). 取消选中客户端任务2。这将取消选中客户端角色。但应用程序管理器(顶级节点)将保持选中状态。【问题】 - Tahir
@Tahir Akram 强制 trigger 更改应该解决它。更新的示例。 - Niklas
@TahirAkram 这是您的fiddle的更新版本...添加了一些CSS来澄清树级别(父子关系)http://jsfiddle.net/vimalpatel/fRxVs/440/ - Vimal Patel

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);
            }
         }
      }

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


Edgar,这段代码对我不起作用。PS:我不是那个给你投反对票的人。 - Tahir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接