如果未选中所有子项,我想取消选中父节点。
<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);
}
});
});
答案 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);
}
}
}
这是递归的,因为它必须“冒泡”到根复选框。 希望这可以帮助。干杯