【问题标题】:Check all other checkboxes when one is checked选中一个时选中所有其他复选框
【发布时间】:2013-10-29 12:20:43
【问题描述】:

我有一个表格和一组复选框。 (这些复选框是动态创建的,但我认为这对这个问题并不重要)。生成它们的代码如下所示(表单的一部分):

<div id="ScrollCB">
    <input type="checkbox" name="ALL" value="checked" checked="checked">
    All (if nothing selected, this is default) <br>
    <c:forEach items="${serviceList}" var="service">
       <input type="checkbox" name="${service}" value="checked"> ${service} <br>
    </c:forEach>
</div>

我想要做的是控制是否选中了标记为“ALL”的复选框,如果是 - 选中所有其他复选框(如果未选中,则取消选中它们)。

我试过用这样的 javascript 来做这个(找到了一些教程),但它不起作用(而且我是 javascript 的真正新手,难怪):

<script type="text/javascript">
  $ui.find('#ScrollCB').find('label[for="ALL"]').prev().bind('click',function(){
  $(this).parent().siblings().find(':checkbox').attr('checked',this.checked).attr('disabled',this.checked);
}); });
</script>

你能告诉我一些简单的方法来让它工作吗?非常感谢!

【问题讨论】:

    标签: javascript html jsp


    【解决方案1】:

    demo

    updated_demo

    HTML:

    <label><input type="checkbox" name="sample" class="selectall"/> Select all</label>
    
    <div id="checkboxlist">
    
        <label><input type="checkbox" name="sample[]"/>checkbox1</label><br />
        <label><input type="checkbox" name="sample[]"/>checkbox2</label><br />
        <label><input type="checkbox" name="sample[]"/>checkbox3</label><br />
        <label><input type="checkbox" name="sample[]"/>checkbox4</label><br />
    
    </div>
    

    JS:

    $('.selectall').click(function() {
        if ($(this).is(':checked')) {
            $('div input').attr('checked', true);
        } else {
            $('div input').attr('checked', false);
        }
    });
    

    【讨论】:

    • 这行得通!但是,如果我这样做一次,它就会完成。如果我这样做,例如,检查>取消选中>检查,它就不再起作用了......怎么会?
    • 它有效..即使我像你在评论中提到的那样进行了测试..check>uncheck>check
    • y,我知道它适用于您的代码...当我实现它时,它仅在我第一次与我的代码一起使用时才有效...我不知道为什么...
    • 如果它只工作一次,为什么它是一个标记的解决方案?它还将检查添加到作为输入的任何其他元素。糟糕的解决方案。
    • 我建议使用.prop() 而不是.attr() 来设置复选框的选中属性,至少使用较新版本的jQuery。
    【解决方案2】:

    HTML:

    <form>
    <label>
        <input type="checkbox" id="selectall"/> Select all
    </label>
    <div id="checkboxlist">
        <label><input type="checkbox" name="sample[]"/>checkbox1</label><br />
        <label><input type="checkbox" name="sample[]"/>checkbox2</label><br />
        <label><input type="checkbox" name="sample[]"/>checkbox3</label><br />
        <label><input type="checkbox" name="sample[]"/>checkbox4</label><br />
    </div>
    </form>
    

    JS:

    $('#selectall').click(function() {
        $(this.form.elements).filter(':checkbox').prop('checked', this.checked);
    });
    

    http://jsfiddle.net/wDnAd/1/

    【讨论】:

      【解决方案3】:

      感谢@Ashish,如果您手动勾选所有子复选框,我已经稍微扩展了它以允许自动选中或取消选中“主”复选框。

      FIDDLE

      HTML

      <label><input type="checkbox" name="sample" class="selectall"/>Select all</label>
      
      <div id="checkboxlist">
          <label><input type="checkbox" class="justone" name="sample[]"/>checkbox1</label><br/>
          <label><input type="checkbox" class="justone" name="sample[]"/>checkbox2</label><br />
          <label><input type="checkbox" class="justone" name="sample[]"/>checkbox3</label><br />
          <label><input type="checkbox" class="justone" name="sample[]"/>checkbox4</label><br />
      </div>
      

      脚本

      $('.selectall').click(function() {
          if ($(this).is(':checked')) {
              $('input:checkbox').prop('checked', true);
          } else {
              $('input:checkbox').prop('checked', false);
          }
      });
      

      现在添加它来管理主复选框...

      $("input[type='checkbox'].justone").change(function(){
          var a = $("input[type='checkbox'].justone");
          if(a.length == a.filter(":checked").length){
              $('.selectall').prop('checked', true);
          }
          else {
              $('.selectall').prop('checked', false);
          }
      });
      

      【讨论】:

      • 正确解决方案
      【解决方案4】:

      根据您的复选框组添加额外的脚本:

      <script language="JavaScript">
      function selectAll(source) {
          checkboxes = document.getElementsByName('colors[]');
          for(var i in checkboxes)
              checkboxes[i].checked = source.checked;
      }
      </script>
      

      HTML 代码:

      <input type="checkbox" id="selectall" onClick="selectAll(this,'color')" />Select All
      <ul>
      <li><input type="checkbox" name="colors[]" value="red" />Red</li>
      <li><input type="checkbox" name="colors[]" value="blue" />Blue</li>
      <li><input type="checkbox" name="colors[]" value="green" />Green</li>
      <li><input type="checkbox" name="colors[]" value="black" />Black</li>
      </ul>
      

      【讨论】:

      • 这是唯一使用基本 JavaScript 的答案......即没有 jQuery。简单问题的简单解决方案,人们! (是的,我看到 OP 正在尝试使用 jQuery,但问题标题和正文并没有说明......你永远不知道谁最终会在这里寻找解决方案!)
      【解决方案5】:

      用这个我希望能帮助你我知道这是一个迟到的答案,但如果有人再来这里

      $("#all").change(function () {
              $("input:checkbox").prop('checked', $(this).prop("checked"));
          });
      

      【讨论】:

        【解决方案6】:

        只有在 JavaScript 中,当任何子节点被选中/取消选中时,主节点的自动选中/取消选中功能。

        function FnCheckAll()
            {
                var ChildChkBoxes = document.getElementsByName("ChildCheckBox");
                for (i = 0; i < ChildChkBoxes.length; i++)
                {
                    ChildChkBoxes[i].checked = document.forms[0].CheckAll.checked;
                }
            }
        function FnCheckChild()
            {
                if (document.forms[0].ChildCheckBox.length > document.querySelectorAll('input[name="ChildCheckBox"]:checked').length)
                    document.forms[0].CheckAll.checked = false;
                else
                    document.forms[0].CheckAll.checked = true;
            }
        

        主复选框:

        <input type="checkbox" name="CheckAll" id="CheckAll" onchange="FnCheckAll()" />
        

        子复选框:

        <input type="checkbox" name="ChildCheckBox" id="ChildCheckBox" onchange="FnCheckChild()" value="@employee.Id" />```
        

        【讨论】:

          【解决方案7】:

          你可以像这样使用 jQuery:

          jQuery

          $('[name="ALL"]:checkbox').change(function () {
             if($(this).attr("checked")) $('input:checkbox').attr('checked','checked');
             else $('input:checkbox').removeAttr('checked');
          });
          

          fiddle

          【讨论】:

          • input:checkbox:checkbox 是同一个东西
          • 还在你的答案中发布你的代码,这可能是你被否决的原因。
          【解决方案8】:
          var selectedIds = [];
          function toggle(source) {
              checkboxes = document.getElementsByName('ALL');
              for ( var i in checkboxes)
                  checkboxes[i].checked = source.checked;
          }
          function addSelects() {
          
              var ids = document.getElementsByName('ALL');
          
              for ( var i = 0; i < ids.length; i++) {
                  if (ids[i].checked == true) {
                      selectedIds.push(ids[i].value);
                  }
              }
          }
          

          在 HTML 中:

          主复选框&lt;input type="checkbox" onClick="toggle(this);"&gt;

          其他复选框&lt;input type="checkbox" name="ALL"&gt;

          【讨论】:

            【解决方案9】:

            您可以使用 :first 选择器来查找第一个输入并将更改事件绑定到它。在下面的示例中,我使用第一个输入的 :checked 状态来定义它的兄弟姐妹的状态。我还建议将代码放在 JQuery 就绪事件中。

                $('document').ready(function(){   
                    $('#ScrollCB input:first').bind('change', function() {
                        var first = $(this);
                        first.siblings().attr('checked', first.is(':checked'));
                    });
                });
            

            【讨论】:

              【解决方案10】:

              我不确定当复选框上有名字时为什么要使用标签。使用它作为选择器。另外,您的代码在 HTML 标记中没有标签,因此它不会找到任何东西。

              这是基本思路

              $(document).on("click",'[name="ALL"]',function() {
                  $(this).siblings().prop("checked",this.checked);
              });
              

              如果有其他元素是同级元素,则需要过滤同级元素

              $(document).on("click",'[name="ALL"]',function() {
                  $(this).siblings(":checkbox").prop("checked",this.checked);
              });
              

              jsFiddle

              【讨论】:

                猜你喜欢
                • 2021-12-01
                • 2013-10-11
                • 1970-01-01
                • 2022-01-25
                • 1970-01-01
                • 2020-10-02
                • 2017-01-03
                • 2020-08-12
                • 2013-01-25
                相关资源
                最近更新 更多