Javascript 为什么单击“全选”复选框时计数错误
我有个问题。我有一些支票。我想马上选择它们,但计数结果是错误的。如果我使用firefox、opera,那么就可以了,但是当我使用crome、safari时,它会给我一个错误的结果。为什么?请帮帮我 我在这里设置了一些代码:Javascript 为什么单击“全选”复选框时计数错误,javascript,jquery,Javascript,Jquery,我有个问题。我有一些支票。我想马上选择它们,但计数结果是错误的。如果我使用firefox、opera,那么就可以了,但是当我使用crome、safari时,它会给我一个错误的结果。为什么?请帮帮我 我在这里设置了一些代码: // add multiple select / deselect functionality $("#selectall").click(function () { $('.case').attr('checked', this.che
// add multiple select / deselect functionality
$("#selectall").click(function () {
$('.case').attr('checked', this.checked);
});
// if all checkbox are selected, check the selectall checkbox
// and viceversa
$(".case").click(function(){
if($(".case").length == $(".case:checked").length) {
$("#selectall").attr("checked", "checked");
} else {
$("#selectall").removeAttr("checked");
}
});
});
$(document).ready(function () {
$("input[type=checkbox]").each(function () {
$(this).change(updateCount);
});
updateCount();
function updateCount () {
var count = $("input[type=checkbox]:checked").size();
$("#count").text(count);
$("#status").toggle(count > 0);
};
});
首先,改用length
属性
其次,您可能希望将计数的复选框限制为带有.case
类的复选框:
var count = $("input[type=checkbox].case:checked").length;
第三,按照编写代码的方式,您应该在单击事件上调用updateCount()
,而不是change
事件,并且您不需要那里的匿名函数:
$("input[type=checkbox]").click(updateCount);
我保存了JSFIDLE的一个新版本:单击是捕获不更改的正确事件。还有,为什么要进行迭代绑定。将您的document.ready替换为以下内容:
$(document).ready(function () {
$("input").bind('click', function () {
updateCount();
});
updateCount();
function updateCount () {
var count = $( "input:checked" ).length;
$("#count").text(count);
$("#status").toggle(count > 0);
};
});
正如Angela所说,您应该监听更改事件,不能保证在复选框的值更改后调用单击。此外,该值可能会因其他原因而更改,例如在字段中使用Tab键和点击空格。同样重要的是要认识到,当您以编程方式设置复选框的值时,更改事件不会在之后触发,因此当您以编程方式设置值时,您必须自己调用updateCount,因此,没有理由将updateCount绑定到click,只需在处理任何复选框的更改事件时调用它即可
这里有一个完整的片段,与您所拥有的一样,只是我始终保持计数可见
$(function(){
function updateCount () {
var count = $("input.case[type=checkbox]:checked").length;
$("#count").text(count);
}
updateCount();
// add multiple select / deselect functionality
$("#selectall").change(function() {
$('.case').prop('checked', this.checked);
updateCount();
});
// if all checkbox are selected, check the selectall checkbox
// and viceversa
$(".case").change(function(){
if($(".case").length == $(".case:checked").length) {
$("#selectall").attr("checked", "checked");
} else {
$("#selectall").removeAttr("checked");
}
updateCount();
});
});
如果选中“全选”,输出不应该是6吗?至少在歌剧中是这样的。如果那是你想要的行为,那么是的。但我觉得这不是OP想要的。如果是这样,他可以忽略上面的第二点,而不将.case
添加到选择器中。非常感谢。你能告诉我怎么投票给你吗?因为我想投你一票。但是我不知道怎么投票。你需要15个声望才能投票。你应该去看电影▲ 在答案左边的大数字上方。如果没有,不用担心。$(“输入”).bind('click',function(){updateCount();})代码>可以简化为$(“输入”)。单击(updateCount)
,更好的是,change
事件在语义上更为正确,因为您希望在复选框的值更改时更新,这可能发生在您单击复选框并单击空格时,但我希望一次选中所有项,并且选中所有复选框将不可计数