如何使用jQuery选择所有复选框?


72

我需要有关jQuery选择器的帮助。假设我有一个标记,如下所示:

<form>
  <table>
    <tr>
      <td><input type="checkbox" id="select_all" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
  </table>
</form>

除了#select_all用户单击时,如何获取所有复选框?


这里是codepen这个链接codepen.io/nickhq/pen/pZJVEr
尼克松KOSGEI

Answers:


111

适用于您的情况的更完整的示例:

$('#select_all').change(function() {
  var checkboxes = $(this).closest('form').find(':checkbox');
  checkboxes.prop('checked', $(this).is(':checked'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <table>
    <tr>
      <td><input type="checkbox" id="select_all" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
  </table>
</form>

#select_all被点击复选框,该复选框的状态进行检查,并在当前形式的所有复选框被设置为相同的状态。

请注意,您无需#select_all从选择中排除该复选框,因为该复选框的状态将与其他所有复选框相同。如果出于某些原因确实需要排除#select_all,则可以使用以下方法:

$('#select_all').change(function() {
  var checkboxes = $(this).closest('form').find(':checkbox').not($(this));
  checkboxes.prop('checked', $(this).is(':checked'));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <table>
    <tr>
      <td><input type="checkbox" id="select_all" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
  </table>
</form>


14
对我而言,这仅是第一次使用(即,全部选中,全部取消选中)。在第二个“全部检查”上,没有选中其他复选框。我使用checkboxes.prop('checked', true);checkboxes.prop('checked', false);而不是从这个答案。糟糕,刚意识到这是在页面下方的答案中提到的...
Felix

3
jQuery文档指出,$( "[type=checkbox]" )对于现代浏览器而言,该速度更快(比更快$(':checkbox'))。
Todd

52

简单干净:

$('#select_all').click(function() {
  var c = this.checked;
  $(':checkbox').prop('checked', c);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
  <table>
    <tr>
      <td><input type="checkbox" id="select_all" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
    <tr>
      <td><input type="checkbox" name="select[]" /></td>
    </tr>
  </table>
</form>


4
这也可能是这样...$(':checkbox').prop('checked', this.checked);
Earthmover 2014年

细微-将检索到的复选框的选中状态设置为等于我们最近修改的“主”复选框的状态-考虑到它时简单,优雅且令人惊讶地符合逻辑-谢谢!
大富翁

29

由于attr()方法,最佳答案在Jquery 1.9+中不起作用。使用prop()代替:

$(function() {
    $('#select_all').change(function(){
        var checkboxes = $(this).closest('form').find(':checkbox');
        if($(this).prop('checked')) {
          checkboxes.prop('checked', true);
        } else {
          checkboxes.prop('checked', false);
        }
    });
});

为此,我在JQuery 1.8.3中使用了您的实现;-)
Big Rich

1
OP修改了答案以应对“最近的”更改:)
Erenor Paz 2016年

19
$("form input[type='checkbox']").attr( "checked" , true );

或者您可以使用

:复选框选择器

$("form input:checkbox").attr( "checked" , true );

我已经重写了您的HTML,并为主要复选框提供了点击处理程序

$(function(){
    $("#select_all").click( function() {
        $("#frm1 input[type='checkbox'].child").attr( "checked", $(this).attr("checked" ) );
    });
});

<form id="frm1">
    <table>
        <tr>
            <td>
                <input type="checkbox" id="select_all" />
            </td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="select[]" class="child" />
            </td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="select[]" class="child" />
            </td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" name="select[]" class="child" />
            </td>
        </tr>
    </table>
</form>

只是要注意不要选中页面上的每个复选框... :)
Thiago Belem 2010年

实际上,正确的语法是.attr("checked", "checked")
塔图·乌尔曼嫩

+1感谢rahul,但是当用户单击#select_all复选框时,我需要找到所有复选框。
达尔曼·阿曼巴耶夫

3
 $(function() {  
$('#select_all').click(function() {
    var checkboxes = $(this).closest('form').find(':checkbox');
    if($(this).is(':checked')) {
        checkboxes.attr('checked', 'checked');
    } else {
        checkboxes.removeAttr('checked');
    }
});
    });

3
 $(document).ready(function(){
    $("#select_all").click(function(){
      var checked_status = this.checked;
      $("input[name='select[]']").each(function(){
        this.checked = checked_status;
      });
    });
  });

3
jQuery(document).ready(function () {
        jQuery('.select-all').on('change', function () {
            if (jQuery(this).is(':checked')) {
                jQuery('input.class-name').each(function () {
                    this.checked = true;
                });
            } else {
                jQuery('input.class-name').each(function () {
                    this.checked = false;
                });
            }
        });
    });

代码很棒,但是总是欢迎对为什么有帮助的一些解释。
罗里·麦克罗森

2

这段代码对我来说很好

<script type="text/javascript">
$(document).ready(function(){ 
$("#select_all").change(function(){
  $(".checkbox_class").prop("checked", $(this).prop("checked"));
  });
});
</script>

你只需要添加类checkbox_class所有复选框

简便:D


2
$("#select_all").change(function () {

    $('input[type="checkbox"]').prop("checked", $(this).prop("checked"));

});  

感谢您提供此代码段,它可能会提供一些有限的即时帮助。通过说明为什么这是一个很好的解决方案,正确的解释将大大提高其长期价值,并使之对其他存在类似问题的读者来说更有用。请编辑您的答案以添加一些解释,包括您所做的假设。
马克西米利安·彼得斯

1

面对此问题,以上答案均无效。原因是在jQuery Uniform插件中(使用主题metronic)。我希望答案会是有用的:)

使用jQuery Uniform

$('#select-all').change(function() {
    var $this = $(this);
    var $checkboxes = $this.closest('form')
        .find(':checkbox');

    $checkboxes.prop('checked', $this.is(':checked'))
        .not($this)
        .change();
});

1

一个复选框可以全部统治

对于仍在寻找插件来通过轻量级控件来控制复选框的人,它们具有对UniformJS和iCheck的开箱即用的支持,并且在至少一个受控复选框未被选中时被取消选中(当所有受控复选框都被选中时被选中)当然)我创建了一个jQuery checkAll插件

随时检查文档页面上的示例。


对于此问题示例,您需要做的是:

$( '#select_all' ).checkall({
    target: 'input[type="checkbox"][name="select"]'
});

这不是很简单吗?


0
$('.checkall').change(function() {
    var checkboxes = $(this).closest('table').find('td').find(':checkbox');
    if($(this).is(':checked')) {
        checkboxes.attr('checked', 'checked');
    } else {
        checkboxes.removeAttr('checked');
    }
});


0

我现在偏爱这种风格。

我已经为您的表单命名,并在您的select_all框中添加了“ onClick”。

我还从jquery选择器中排除了“ select_all”复选框,以防止有人单击它时互联网爆炸。

 function toggleSelect(formname) {
   // select the form with the name 'formname', 
   // then all the checkboxes named 'select[]'
   // then 'click' them
   $('form[name='+formname+'] :checkbox[name="select[]"]').click()
 }

 <form name="myform">
   <tr>
        <td><input type="checkbox" id="select_all"    
                   onClick="toggleSelect('myform')" />
        </td>
    </tr>
    <tr>
        <td><input type="checkbox" name="select[]"/></td>
    </tr>
    <tr>
        <td><input type="checkbox" name="select[]"/></td>
    </tr>
    <tr>
        <td><input type="checkbox" name="select[]"/></td>
    </tr>
</table>


0

这是我写的一个基本的jQuery插件,它选择了页面上的所有复选框,除了将用作切换的复选框/元素:

(function($) {
    // Checkbox toggle function for selecting all checkboxes on the page
    $.fn.toggleCheckboxes = function() {
        // Get all checkbox elements
        checkboxes = $(':checkbox').not(this);

        // Check if the checkboxes are checked/unchecked and if so uncheck/check them
        if(this.is(':checked')) {
            checkboxes.prop('checked', true);
        } else {
            checkboxes.prop('checked', false);
        }
    }
}(jQuery));

然后只需在复选框或按钮元素上调用该函数:

// Check all checkboxes
$('.check-all').change(function() {
    $(this).toggleCheckboxes();
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.