【问题标题】:Uncheck parent node if all children unchecked in JQuery如果在 JQuery 中未选中所有子节点,则取消选中父节点
【发布时间】:2017-11-23 17:17:29
【问题描述】:

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

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

【问题讨论】:

    标签: jquery


    【解决方案1】:

    每次取消选中孩子时,您都会取消选中父 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/

    【讨论】:

    • 对不起,它不起作用。如果我有另一个像客户端角色这样的节点,并且它还可以有 2 个客户端任务。有什么提示吗?因为它在 Client Role 的 Sibling 节点上不起作用。
    • @Tahir Akram 对代码进行了小幅更新,现在应该可以正常工作了。
    • A)。检查客户端任务 2(最后一个节点)B)。取消选中客户端任务 2。它将取消选中客户端角色。但应用程序管理器(顶部节点)将保持选中状态。 [问题]
    • @Tahir Akram 强制 trigger 更改应该可以解决它。更新示例。
    • @TahirAkram 这是你的小提琴的更新版本...添加了一些 CSS 来阐明树级别(父子关系)jsfiddle.net/vimalpatel/fRxVs/440
    【解决方案2】:

    这里有:

    $("#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);
                }
             }
          }
    

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

    【讨论】:

    • 埃德加,代码对我不起作用。 PS:我不是反对者。
    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多