Javascript 为什么单击“全选”复选框时计数错误

Javascript 为什么单击“全选”复选框时计数错误,javascript,jquery,Javascript,Jquery,我有个问题。我有一些支票。我想马上选择它们,但计数结果是错误的。如果我使用firefox、opera,那么就可以了,但是当我使用crome、safari时,它会给我一个错误的结果。为什么?请帮帮我 我在这里设置了一些代码: // add multiple select / deselect functionality $("#selectall").click(function () { $('.case').attr('checked', this.che

我有个问题。我有一些支票。我想马上选择它们,但计数结果是错误的。如果我使用firefox、opera,那么就可以了,但是当我使用crome、safari时,它会给我一个错误的结果。为什么?请帮帮我

我在这里设置了一些代码:

    // 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
事件在语义上更为正确,因为您希望在复选框的值更改时更新,这可能发生在您单击复选框并单击空格时,但我希望一次选中所有项,并且选中所有复选框将不可计数