【问题标题】:How to count every checked checkboxes如何计算每个选中的复选框
【发布时间】:2013-01-21 11:14:10
【问题描述】:

这是我的代码:

它实际上计算选中的复选框并将其写入<span class="counter"></span>。此代码适用于 Firefox,但不适用于 Chrome。

在 Chrome 上, .select_all 选中我想要的所有复选框,但不更新计数器。实际上,当我取消选中 .select_all 时,计数器会更新,这很奇怪。

重要事实:我不想计算 .counter 中的 .Select_all 复选框

jQuery(document).ready(function($){

$(function() {
    $('#general i .counter').text(' ');

    var generallen = $("#general-content input[name='wpmm[]']:checked").length;
    if(generallen>0){$("#general i .counter").text('('+generallen+')');}else{$("#general i .counter").text(' ');}
})

$("#general-content input:checkbox").on("change", function() {
    var len = $("#general-content input[name='wpmm[]']:checked").length;
    if(len>0){$("#general i .counter").text('('+len+')');}else{$("#general i .counter").text(' ');}
});


$(function() {
    $('.select_all').change(function() {
        var checkthis = $(this);
        var checkboxes = $(this).parent().next('ul').find("input[name='wpmm[]']");

        if(checkthis.is(':checked')) {
            checkboxes.attr('checked', true);
        } else {
            checkboxes.attr('checked', false);
        }
    });
});

});

编辑:这是代码的示例文档:http://jsfiddle.net/8PVDy/1/

【问题讨论】:

标签: javascript jquery checkbox


【解决方案1】:

您可以使用函数来更新计数器:

function updateCounter() {
    var len = $("#general-content input[name='wpmm[]']:checked").length;
    if(len > 0){
       $("#general i .counter").text('('+len+')');
    } else { 
       $("#general i .counter").text(' ');
    }
}

当一个复选框的状态改变时调用这个函数(包括全选复选框)

这是一个更新的 jsFiddle:http://jsfiddle.net/8PVDy/4/

【讨论】:

    【解决方案2】:

    我发现在上述所有答案中缺少的是关于如何以有效方式收听点击的解释,因为该问题与 onChange 事件紧密耦合。另一件事是该问题没有指定代码是否应仅在 Jquery 中,我认为添加 vanilla JS 解决方案应该是一个好主意。

    这是我将计算的复选框的 HTML 列表。我以更通用的方式解决了这个问题,以便更容易在不同的条件下应用。我计划在全局范围内按每个部分计算复选框。

    <div class="wrapper">
      <section class="list list-1">
        <label for="id-11"><input type="checkbox" id="id-11"></label>
        <label for="id-12"><input type="checkbox" id="id-12"></label>
        <label for="id-13"><input type="checkbox" id="id-13"></label>
        <label for="id-14"><input type="checkbox" id="id-14"></label>
        <label for="id-15"><input type="checkbox" id="id-15"></label>
        <label for="id-16"><input type="checkbox" id="id-16"></label>
        <label for="id-17"><input type="checkbox" id="id-17"></label>
        <label for="id-18"><input type="checkbox" id="id-18"></label>
        <label for="id-19"><input type="checkbox" id="id-19"></label>
        <label for="id-110"><input type="checkbox" id="id-110"></label>
        <span class="list-score">Section 1: <span class="number">0</span></span>
      </section>
    
      <section class="list list-2">
        <label for="id-21"><input type="checkbox" id="id-21"></label>
        <label for="id-22"><input type="checkbox" id="id-22"></label>
        <label for="id-23"><input type="checkbox" id="id-23"></label>
        <label for="id-24"><input type="checkbox" id="id-24"></label>
        <label for="id-25"><input type="checkbox" id="id-25"></label>
        <label for="id-26"><input type="checkbox" id="id-26"></label>
        <label for="id-27"><input type="checkbox" id="id-27"></label>
        <label for="id-28"><input type="checkbox" id="id-28"></label>
        <label for="id-29"><input type="checkbox" id="id-29"></label>
        <label for="id-210"><input type="checkbox" id="id-210"></label>
        <span class="list-score">Section 2: <span class="number">0</span></span>
      </section>
    
      <section class="list list-3">
        <label for="id-31"><input type="checkbox" id="id-31"></label>
        <label for="id-32"><input type="checkbox" id="id-32"></label>
        <label for="id-33"><input type="checkbox" id="id-33"></label>
        <label for="id-34"><input type="checkbox" id="id-34"></label>
        <label for="id-35"><input type="checkbox" id="id-35"></label>
        <label for="id-36"><input type="checkbox" id="id-36"></label>
        <label for="id-37"><input type="checkbox" id="id-37"></label>
        <label for="id-38"><input type="checkbox" id="id-38"></label>
        <label for="id-39"><input type="checkbox" id="id-39"></label>
        <label for="id-310"><input type="checkbox" id="id-310"></label>
        <span class="list-score">Section 3: <span class="number">0</span></span>
      </section>
    
      <span class="total-score">Total: <span class="number">0</span></span>
    </div>
    
    
    

    这是 JS 标记,它侦听 .wrapper div 内的所有点击,并计算 .wrapper 和每个 .list 部分上下文中的选定输入。

    const total = document.querySelector('.total-score .number')
    
    document.querySelector('.wrapper').addEventListener('change', function(event) { // First we apply the ONLY one listener to do the listening for us - we don't need listener on each checkbox
      const numberAll = this.querySelectorAll('input[type="checkbox"]:checked').length // We count all selected inputs in side the main wrapper. 
      total.innerHTML = numberAll // We update the total counter
    
      const list = event.target.closest('.list') // We look and cache the closest section, wrapping the clicked checkbox element
      const numberList = list.querySelectorAll('input[type="checkbox"]:checked').length // Once found, we start to count the number of selected checboxes under the section
      list.querySelector('.list-score .number').innerHTML = numberList // We update the sectiona relevant counter
    })
    

    这是 JS fiddle 中的实时示例: https://jsfiddle.net/mkbctrlll/yak4oqj9/159/

    在 Vanilla JS 中,您必须知道将 change 侦听器应用于每个复选框会慢得多。相反,您应该使用所谓的事件委托并将侦听器应用于包装元素甚至整个文档。

    在这里你可以自己检查一下,列表中每个输入的监听变化有多慢:

    https://jsperf.com/change-listener-on-each-vs-event-delegation/1

    较慢选项的代码(只是为了比较):

    document.querySelector('.wrapper').addEventListener('change', function() {
        const numberAll = this.querySelectorAll('input[type="checkbox"]:checked').length
        total.innerHTML = numberAll
      })
    
    document.querySelectorAll('.list').forEach((list) => {
      list.addEventListener('change', function() {
        const numberAll = this.querySelectorAll('input[type="checkbox"]:checked').length
        this.querySelector('.list-score .number').innerHTML = numberAll
      })
    })
    

    以及我在 jQuery 中的解决方案:

    $('.wrapper').change(function() {
      const numberAll = $(this).find('input[type="checkbox"]:checked').length
      total.innerHTML = numberAll
    
      const $list = $(event.target).closest('.list')
      const numberList = $list.find('input[type="checkbox"]:checked').length
      $($list.find('.list-score .number')).html(numberList)
    })
    

    附:我也尝试将 jQuery 解决方案添加到基准测试中,但它的性能似乎是假的,所以我决定不使用它。

    【讨论】:

      【解决方案3】:

      你可以这样做

      $(document).ready(function(){
      $('input[type="checkbox"]').click(function(){
          alert($('.test:checked').length);
      
      });
      });
      

      我使用的 HTML

      <input type="checkbox" name="test" class="test" value=""/>  
      <input type="checkbox" name="test" class="test" value=""/>  
      <input type="checkbox" name="test" class="test" value=""/>  
      <input type="checkbox" name="checkAll" class="checkAll" value=""/>
      

      希望对你有帮助

      【讨论】:

        【解决方案4】:

        修改了select all-handler来触发像这样子类checkbox的onchange函数

        $(function() {
            $('.select_all').change(function() {
                var checkthis = $(this);
                var checkboxes = $(this).parent().next('ul').find("input[name='wpmm[]']");
        
                if(checkthis.is(':checked')) {
                    checkboxes.attr('checked', true);
                } else {
                    checkboxes.attr('checked', false);
                }
                // make sure to trigger the onchange behaviour for the checkboxes
                $("#general-content input:checkbox").change();
            });
        })
        

        我好像记得有一个更漂亮的方法可以触发它们,但是找不到

        【讨论】:

          【解决方案5】:

          试试这个。

          $('.select_all').change(function() {
          var num = $(this).find("input[name='wpmm[]']:checked").length;
          $("#general .counter").html(num);
          });
          

          【讨论】:

            【解决方案6】:

            要更新检查状态,请使用 jQuery.prop() 函数

            代码:

            $(function(){
                $('#general i .counter').text(' ');
            
                var fnUpdateCount = function() {
                    var generallen = $("#general-content input[name='wpmm[]']:checked").length;
                    console.log(generallen,$("#general i .counter") )
                    if (generallen > 0) {
                        $("#general i .counter").text('(' + generallen + ')');
                    } else {
                        $("#general i .counter").text(' ');
                    }
                };
            
                $("#general-content input:checkbox").on("change", function() {
                            fnUpdateCount();
                        });
            
                $('.select_all').change(function() {
                            var checkthis = $(this);
                            var checkboxes = $("#general-content input:checkbox");
            
                            if (checkthis.is(':checked')) {
                                checkboxes.prop('checked', true);
                            } else {
                                checkboxes.prop('checked', false);
                            }
                            fnUpdateCount();
                        });
            });
            

            演示:Fiddle

            【讨论】:

              【解决方案7】:
              $('input[type="checkbox"]:checked').length
              

              【讨论】:

              • 重要事实:我不想计算 .counter 中的 .Select_all 复选框
              • $('input[type="checkbox"]:checked').not('.Select_all').length
              猜你喜欢
              • 1970-01-01
              • 2022-03-03
              • 1970-01-01
              • 2012-08-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-06-10
              • 2012-01-20
              相关资源
              最近更新 更多