【问题标题】:How to add check box checked count value如何添加复选框选中的计数值
【发布时间】:2017-05-22 22:36:27
【问题描述】:

我需要在元素中添加复选框选中计数值的总数。

但是当我选中“标题2”部分中的复选框时,计数值已添加到“标题1”部分中。

我没有找到任何问题,请指导我解决这个问题

DEMO

HTML:

    <div id="main">


    <div class="a">
                <div class="row">
                  <div class="col-md-12 cb_select_head">
                    <a data-parent="#accordion" data-toggle="collapse" href="#function-collapse"><span class=
                                    "glyphicon ecm-caret-down"></span></a><span class="labelBlock labelCounter">
                                    <span class="count-checked-checkboxes">0</span></span>
                    <span class="fb_options_head">heading 1</span>
                  </div>
                  <ul class="sidebar fb-list-option collapse in" id="function-collapse">
                    <li><a href="" data-toggle="collapse" data-target="#Actuarial-collapse"><span class="glyphicon ecm-caret-right"></span></a>
                      <input id="c1" name="cc" type="checkbox">
                      <label for="c1">asdas</label>

                    </li>
                    <li class="noArrow">
                      <input id="c2" name="cc" type="checkbox">
                      <label for="c2">asdasd</label>
                    </li>
                    <li><a href="" data-toggle="collapse"><span class="glyphicon ecm-caret-right"></span></a>
                      <input id="c3" name="cc" type="checkbox">
                      <label for="c3">asdasd
                      </label>

                      <ul>
                                    <li><input id="c1" name="cc" type="checkbox"><label for="c1">asd 1</label></li>
                                    <li><input id="c1" name="cc" type="checkbox"><label for="c1">sadas 2</label></li>
                                    <li><input id="c1" name="cc" type="checkbox"><label for="c1">asdas 3</label></li>
                                    </ul>
                    </li>
                    <li><a href="" data-toggle="collapse"><span class="glyphicon ecm-caret-right"></span></a>
                      <input id="c4" name="cc" type="checkbox">
                      <label for="c4">asdasd</label>
                    </li>
                    <li class="noArrow">
                      <input id="c5" name="cc" type="checkbox">
                      <label for="c5">five</label>
                    </li>
                  </ul>
                </div>
              </div>
          <!--First List End-->

          <!--Second list start -->

             <div class="a">
                <div class="row">
                  <div class="col-md-12 cb_select_head">
                    <a data-parent="#accordion" data-toggle="collapse" href="#function-collapse"><span class=
                                    "glyphicon ecm-caret-down"></span></a><span class="labelBlock labelCounter">
                                    <span class="count-checked-checkboxes">0</span></span>
                    <span class="fb_options_head">heading 2</span>
                  </div>
                  <ul class="sidebar fb-list-option collapse in" id="function-collapse">
                    <li><a href="" data-toggle="collapse" data-target="#Actuarial-collapse"><span class="glyphicon ecm-caret-right"></span></a>
                      <input id="c1" name="cc" type="checkbox">
                      <label for="c1">asdas</label>

                    </li>
                    <li class="noArrow">
                      <input id="c2" name="cc" type="checkbox">
                      <label for="c2">asdasd</label>
                    </li>
                    <li><a href="" data-toggle="collapse"><span class="glyphicon ecm-caret-right"></span></a>
                      <input id="c3" name="cc" type="checkbox">
                      <label for="c3">asdasd
                      </label>

                      <ul>
                                    <li><input id="c1" name="cc" type="checkbox"><label for="c1">asd 1</label></li>
                                    <li><input id="c1" name="cc" type="checkbox"><label for="c1">sadas 2</label></li>
                                    <li><input id="c1" name="cc" type="checkbox"><label for="c1">asdas 3</label></li>
                                    </ul>
                    </li>
                    <li><a href="" data-toggle="collapse"><span class="glyphicon ecm-caret-right"></span></a>
                      <input id="c4" name="cc" type="checkbox">
                      <label for="c4">asdasd</label>
                    </li>
                    <li class="noArrow">
                      <input id="c5" name="cc" type="checkbox">
                      <label for="c5">five</label>
                    </li>
                  </ul>
                </div>
              </div>  


 </div>

JS:

$(document).ready(function() {
    var $checkboxes = $(
        '#main ul input[type="checkbox"]');
    $checkboxes.change(function() {
        var countCheckedCheckboxes = $checkboxes.filter(
            ':checked').length;
        $('.count-checked-checkboxes').text(
            countCheckedCheckboxes);
        $('#edit-count-checked-checkboxes').val(
            countCheckedCheckboxes);
    });
});

【问题讨论】:

  • ID 必须是唯一的
  • @j08691:是的,如果你有任何想法,请分享一下
  • @Mgr 这对你有用吗?? jsfiddle.net/gqcgwjq2/5

标签: javascript jquery


【解决方案1】:

查看有效的解决方案。记住 ID 需要是唯一的,并且尽可能避免使用 ID,例如将输入元素放在标签内而不是与 Id 一起使用

$(document).ready(function() {
  var $checkboxes1 = $('#head1 ul input[type="checkbox"]');
  var $checkboxes2 = $('#head2 ul input[type="checkbox"]');
  $checkboxes1.change(function() {
    var countCheckedCheckboxes = $checkboxes1.filter(':checked').length;
    $('#head1 .count-checked-checkboxes').text(countCheckedCheckboxes);
  });
  $checkboxes2.change(function() {
    var countCheckedCheckboxes = $checkboxes2.filter(':checked').length;
    $('#head2 .count-checked-checkboxes').text(countCheckedCheckboxes);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="main">
  <div id="head1">
    <div class="row">
      <div class="col-md-12 cb_select_head">
        <span class="count-checked-checkboxes">0</span>
        <span class="fb_options_head">heading 1</span>
      </div>
      <ul class="sidebar fb-list-option collapse in">
        <li>
          <label>
            <input name="cc" type="checkbox">One
          </label>
        </li>
        <li class="noArrow">
          <label>
            <input name="cc" type="checkbox">Two
          </label>
        </li>
        <li>
          <ul>
            <li>
              <label>
                <input name="cc" type="checkbox">3 - a
              </label>
            </li>
            <li>
              <label>
                <input name="cc" type="checkbox">3 -b
              </label>
            </li>
            <li>
              <label>
                <input name="cc" type="checkbox">2 - c
              </label>
            </li>
          </ul>
        </li>
        <li>
          <label>
            <input name="cc" type="checkbox">four
          </label>
        </li>
        <li class="noArrow">
          <label>
            <input name="cc" type="checkbox">five
          </label>
        </li>
      </ul>
    </div>
  </div>
  <!--First List End-->

  <!--Second list start -->

  <div class="a" id="head2">
    <div class="row">
      <div class="col-md-12 cb_select_head">
        <span class="count-checked-checkboxes">0</span>
        <span class="fb_options_head">heading 1</span>
      </div>
      <ul class="sidebar fb-list-option collapse in">
        <li>
          <label>
            <input name="cc" type="checkbox">One
          </label>
        </li>
        <li class="noArrow">
          <label>
            <input name="cc" type="checkbox">Two
          </label>
        </li>
        <li>
          <ul>
            <li>
              <label>
                <input name="cc" type="checkbox">3 - a
              </label>
            </li>
            <li>
              <label>
                <input name="cc" type="checkbox">3 - b
              </label>
            </li>
            <li>

              <label>
                <input name="cc" type="checkbox">2 - c
              </label>
            </li>
          </ul>
        </li>
        <li>
          <label>
            <input name="cc" type="checkbox">four
          </label>
        </li>
        <li class="noArrow">
          <label>
            <input name="cc" type="checkbox">five
          </label>
        </li>
      </ul>
    </div>
  </div>


</div>

【讨论】:

    【解决方案2】:

    看看是不是this works

    忽略其他人提到的所有内容,关于 ID 是否需要唯一,我能够使用 DOM 遍历来计算每个标题的复选框。

    我把 jQuery 改成:

    $(document).ready(function() {
        $('.a').each(function(){
            var $checkboxes = $(this).find('input[type="checkbox"]');
            $checkboxes.change(function() {
               var countCheckedCheckboxes = $checkboxes.filter(':checked').length;
            $(this).closest('.a').find('.count-checked-checkboxes').text(
                countCheckedCheckboxes);
            });
        });
    });
    
    1. 循环遍历每个元素“.a”
    2. 使用 $(this).find('input[type="checkbox"]');只获取相关的复选框
    3. 更改时,向上遍历 DOM 直到找到“.a”,然后向下遍历并找到标题类“.count-checked-checkboxes”

    不过可能有更好的方法来做到这一点。

    .closest() 从当前元素开始向上移动寻找匹配项。

    .find() 通过后代向下传播。

    【讨论】:

      【解决方案3】:

      几件事。

      j08691 是对的,ID 必须是唯一的。浏览器正在获取第一个 #count-checked-checkboxes 并填充该值。

      此外,您将获得所有复选框的计数,这将对所有复选框进行计数,无论它们位于哪个 div

      我建议如下:

      $(document).ready(function() {
          var $checkboxes = $(
              '.a ul input[type="checkbox"]');
          $checkboxes.change(function() {
              var countCheckedCheckboxes = $checkboxes.filter(
                  ':checked').length;
              $('#count-checked-checkboxes-a').text(
                  countCheckedCheckboxes);
              $('#edit-count-checked-checkboxes-a').val(
                  countCheckedCheckboxes);
          });
      });
      

      但是你仍然得到所有的复选框。此时我会将您的第二个&lt;div class="a"&gt; 更改为&lt;div class="b"&gt;,然后像这样复制上述语句:

      $(document).ready(function() {
          var $checkboxes = $(
              '.b ul input[type="checkbox"]');
          $checkboxes.change(function() {
              var countCheckedCheckboxes = $checkboxes.filter(
                  ':checked').length;
              $('#count-checked-checkboxes-b').text(
                  countCheckedCheckboxes);
              $('#edit-count-checked-checkboxes-b').val(
                  countCheckedCheckboxes);
          });
      });
      

      当然还要更改您的 ID 以匹配 jquery 中的 ID。

      https://jsfiddle.net/gqcgwjq2/28/

      【讨论】:

      • 是的,请参阅链接。另一方面,我一直认为 jQuery 使 document.ready 过时了,因为 $()​​ 语法会等到文档准备好后再触发定义的事件?我错了吗?另外,它有效。什么给了?
      猜你喜欢
      • 2019-08-10
      • 2013-10-15
      • 2014-02-21
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2023-03-20
      • 2011-11-16
      相关资源
      最近更新 更多