我认为这里有一点逻辑问题。
假设您有父母,孩子和孩子的孩子,根据您的要求,当您单击未选中的孩子时,会检查当前元素并检查此元素的子元素以及此元素的父元素,但是这个兄弟姐妹没有检查对吗?
当您单击父级时会发生什么?没有一个复选框被选中?因此,如果我决定选中所有复选框,但我已经选中了一个子复选框,这意味着我必须选中父复选框以取消选中所有内容,然后再次单击它以选中所有复选框?
这不是很好的用户体验。无论如何,我认为最好的做法是将函数单击事件分离到三个不同的侦听器中,而不是尝试在一个函数中执行。考虑到这一点,当您检查所有内容并取消选中其中一个孩子时,我没有写出用例,然后仍应选中父复选框。你必须继续扩展这些。
<ul class="level-one">
<li class="level-one-closed">
<span class="level-one-folder">
<input type="checkbox" class="userPermissionCheckBox-level-one" />
Parent
</span>
<ul class="level-two">
<li class="level-two-closed">
<span class="level-two-folder">
<input type="checkbox" class="userPermissionCheckBox-level-two" />
Child
</span>
<ul class="level-three">
<li>
<span class="level-three-folder">
<input type="checkbox" class="userPermissionCheckBox-level-three" />
Child's Child
</span>
</li>
</ul>
</li>
<li class="level-two-closed">
<span class="level-two-folder">
<input type="checkbox" class="userPermissionCheckBox-level-two" />
Child
</span>
<ul class="level-three">
<li>
<span class="level-three-folder">
<input type="checkbox" class="userPermissionCheckBox-level-three" />
Child's Child
</span>
</li>
<li>
<span class="level-three-folder">
<input type="checkbox" class="userPermissionCheckBox-level-three" />
Child's Child
</span>
</li>
</ul>
</li>
</ul>
</li>
</ul>
var $levelOneCheck = $('.userPermissionCheckBox-level-one');
var $levelTwoCheck = $('.userPermissionCheckBox-level-two');
var $levelThreeCheck = $('.userPermissionCheckBox-level-three');
$levelOneCheck.click(function() {
var $isChecked = $(this).attr('isChecked');
if ($isChecked === 'true') {
$(this).attr('isChecked', 'false');
$levelTwoCheck.prop('checked', false).attr('isChecked', 'false');
$levelThreeCheck.prop('checked', false).attr('isChecked', 'false');
} else {
$(this).attr('isChecked', 'true');
$levelTwoCheck.prop('checked', true).attr('isChecked', 'true');
$levelThreeCheck.prop('checked', true).attr('isChecked', 'true');
}
});
$levelTwoCheck.click(function() {
var $isCheckedLevelTwo = $(this).attr('isChecked');
if ($isCheckedLevelTwo === 'true') {
$(this).attr('isChecked', 'false');
$(this).closest('.level-one-closed').find('.level-one-folder .userPermissionCheckBox-level-one').prop('checked', false).attr('isChecked', 'false');
$(this).closest('.level-two-closed').find('.level-three-folder .userPermissionCheckBox-level-three').prop('checked', false).attr('isChecked', 'false');
} else {
$(this).attr('isChecked', 'true');
$(this).closest('.level-one-closed').find('.level-one-folder .userPermissionCheckBox-level-one').prop('checked', true).attr('isChecked', 'true');
$(this).closest('.level-two-closed').find('.level-three-folder .userPermissionCheckBox-level-three').prop('checked', true).attr('isChecked', 'true');
}
});
$levelThreeCheck.click(function() {
var $isCheckedLevelTwo = $(this).attr('isChecked');
if ($isCheckedLevelTwo === 'true') {
$(this).attr('isChecked', 'false');
$(this).closest('.level-one-closed').find('.level-one-folder .userPermissionCheckBox-level-one').prop('checked', false).attr('isChecked', 'false');
$(this).closest('.level-two-closed').find('.level-two-folder .userPermissionCheckBox-level-two').prop('checked', false).attr('isChecked', 'false');
} else {
$(this).attr('isChecked', 'true');
$(this).closest('.level-one-closed').find('.level-one-folder .userPermissionCheckBox-level-one').prop('checked', true).attr('isChecked', 'true');
$(this).closest('.level-two-closed').find('.level-two-folder .userPermissionCheckBox-level-two').prop('checked', true).attr('isChecked', 'true');
}
});
http://jsfiddle.net/xzigraz/BTXNk/3/