参考这个小提琴(http://jsfiddle.net/7uR2B/),我有同样的功能,比如这个小提琴,检查/取消选中所有子复选框,它现在正常工作。
但是当我将这个用于我的表单并且我的表单在bootstrapvt之后创建时,其他 DIV 和 SPAN 添加到复选框,这个小提琴脚本对于bootstrap不起作用复选框。请帮助我检查/取消选中所有子框。
$('li :checkbox').on('click', function () {
var $chk = $(this),
$li = $chk.closest('li'),
$ul, $parent;
if ($li.has('ul')) {
$li.find(':checkbox').not(this).prop('checked', this.checked)
}
do {
$ul = $li.parent();
$parent = $ul.siblings(':checkbox');
if ($chk.is(':checked')) {
$parent.prop('checked', $ul.has(':checkbox:not(:checked)').length == 0)
} else {
$parent.prop('checked', false)
}
$chk = $parent;
$li = $chk.closest('li');
} while ($ul.is(':not(.someclass)'));
});$('li :checkbox').on('click', function () {
var $chk = $(this),
$li = $chk.closest('li'),
$ul, $parent;
if ($li.has('ul')) {
$li.find(':checkbox').not(this).prop('checked', this.checked)
}
do {
$ul = $li.parent();
$parent = $ul.siblings(':checkbox');
if ($chk.is(':checked')) {
$parent.prop('checked', $ul.has(':checkbox:not(:checked)').length == 0)
} else {
$parent.prop('checked', false)
}
$chk = $parent;
$li = $chk.closest('li');
} while ($ul.is(':not(.someclass)'));
});
<ul>
<li>
<div class="checker"> <span><input type="checkbox"></span>
</div>Administration
<ul>
<li>
<div class="checker"> <span class="checked"><input type="checkbox"></span>
</div>President
<ul>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Manager 1
<ul>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Assistant Manager 1</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Assistant Manager 2</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Assistant Manager 3</li>
</ul>
</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Manager 2</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Manager 3</li>
</ul>
</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Vice President
<ul>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Manager 4</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Manager 5</li>
<li>
<div class="checker"><span><input type="checkbox"></span>
</div>Manager 6</li>
</ul>
</li>
</ul>
</li>
</ul>
的屏幕截图
答案 0 :(得分:2)
您的Bootstrap版本无效,因为checkbox
项位于相对于用于搜索项目的ul
元素($ul = $li.parent();
)的不同位置。您的Bootstrap版本:
<div class="checker">
<span class="checked">
<input type="checkbox">
</span>
</div>President
<ul>...
最初的小提琴版:
<input type="checkbox" />President
<ul>
我稍微更改了您的Fiddled代码,以考虑您在Bootstrap版本中更改的元素位置:
do {
$ul = $li.parent();
//$parent = $ul.siblings(':checkbox'); old code
$parent = $ul.siblings('.checker');
if ($chk.is(':checked')) {
$parent.find(':checkbox').prop('checked', $ul.has(':checkbox:not(:checked)').length == 0)
} else {
$parent.find(':checkbox').prop('checked', false)
}
$chk = $parent;
$li = $chk.closest('li');
} while ($ul.is(':not(.someclass)'));
可以在Bootply Fiddle找到工作样本。
是的,你原来的Fiddle示例代码很酷,它以很酷的方式使用递归循环来获取父元素: - )