我看到了很多选中/取消所有复选框的脚本。但是大多数并没有考虑到如果我使用“全选”复选框切换了所有复选框,然后在列表中取消一个复选框,那么“全选”复选框仍然被选中。
有没有一种优雅的方法来处理这种情况?
我看到了很多选中/取消所有复选框的脚本。但是大多数并没有考虑到如果我使用“全选”复选框切换了所有复选框,然后在列表中取消一个复选框,那么“全选”复选框仍然被选中。
有没有一种优雅的方法来处理这种情况?
$('#checkAll').click(function() {
if(this.checked) {
$('input:checkbox').attr('checked', true);
}
else {
$('input:checkbox').removeAttr('checked');
}
});
$('input:checkbox:not(#checkAll)').click(function() {
if(!this.checked) {
$('#checkAll').removeAttr('checked');
}
else {
var numChecked = $('input:checkbox:checked:not(#checkAll)').length;
var numTotal = $('input:checkbox:not(#checkAll)').length;
if(numTotal == numChecked) {
$('#checkAll').attr('checked', true);
}
}
});
示例:http://jsfiddle.net/ThiefMaster/HuM4Q/
正如评论中指出的那样,普通的复选框并不完美适合这个应用。我的实现方法是当有一个复选框被取消选中时,立即禁用“全选”框。因此,要取消所有已选中的复选框,您需要点击两次(第一次重新选中未选中的复选框,然后再点击取消所有其他的)。 但是,对于三状态复选框,这仍然可能是必要的,因为状态顺序可能是未选中->不确定->选中->未选中,因此您需要点击两次才能从不确定状态转移到未选中状态。
由于您可能不想使用“全选”选项来选中页面上的所有复选框,请将 input:checkbox
替换为 .autoCheckBox
或 input.autoCheckBox:checkbox
,并给这些复选框添加 class="autoCheckBox"
。
如果您想选择某个表单中的所有复选框,只需使用 #idOfYourForm input:checkbox
或 form[name=nameOfYourForm] input:checkbox
即可。
您可以通过为每个目标复选框附加单击处理程序来实现此操作,并根据这些目标复选框的集体状态取消选中“控件”复选框。所以,类似以下内容:
// Control checks/unchecks targets
$('#controlcheckbox').click( function(){
$('.targetcheckboxes').attr('checked', this.checked );
});
// Targets affect control
$('.targetcheckboxes').click( function(){
if( $('.targetcheckboxes:not(:checked)').length ){
$('#controlcheckbox').attr('checked',false);
}
});
.delegate()
监听事件:$('#some_container').delegate('.targetcheckboxes','click',function(){...} );
$("#selectall").click(function(){
var checked = $("#selectall").attr("checked");
$(".selectone").attr("checked",checked);
});
设置全选
$(".selectone").click(function(){
var net = $(".selectone").map(function(){ return jQuery(this).attr("checked");}).get();
var flg = true;
if(jQuery.inArray(false, net)){
flg= false;
}
$("#selectall").attr("checked",flg);
});
也许是这样的:
$('tbody input:checkbox').change(function(){
if ($(this).closest('tbody').find('input:checkbox').not(':checked').length) {
$('#checkAll')[0].checked = false;
}
});
假设您的表格中的#checkAll
位于thead
部分。