启用/禁用复选框


397

我有以下几点:

$(document).ready(function()
{
    $("#select-all-teammembers").click(function() {
        $("input[name=recipients\\[\\]]").attr('checked', true);
    });                 
});

我希望id="select-all-teammembers"单击时可以在已选中和未选中之间切换。有想法吗?那不是几十行代码吗?

Answers:


723

你可以写:

$(document).ready(function() {
    $("#select-all-teammembers").click(function() {
        var checkBoxes = $("input[name=recipients\\[\\]]");
        checkBoxes.prop("checked", !checkBoxes.prop("checked"));
    });                 
});

在jQuery 1.6之前,当我们只有attr()而不是prop()时,我们曾经这样写:

checkBoxes.attr("checked", !checkBoxes.attr("checked"));

但是,prop()attr()应用于“布尔” HTML属性相比,它具有更好的语义,因此在这种情况下通常是首选的。


4
当它根据第一个状态建立状态时可能会产生纠结(因此,如果用户检查第一个状态,然后使用切换开关,他们将不同步)。稍作调整,使状态基于切换,而不是列表中的第一个复选框:$(“ input [name = recipients \ [\]]”)。prop(“ checked”,$(this).prop(“已检查”));
CookiesForDevo

6
使用'prop'也可以使Zepto进行这项工作。否则它将选中该框,但不会取消选中该框。
SimplGy 2012年

1
“ prop”而不是“ attr”起到了作用:使用“ attr”时,它会切换一段时间然后停止,而使用“ prop”时,它会按预期进行切换。+1更新。
TechNyquist 2013年

11
$('input[type=checkbox]').trigger('click');@ 2astalavista在下面提到的内容更为简洁,也触发了“更改”事件。
在这里

1
您可以编辑你的答案,支持@ CookiesForDevo的答案
acquayefrank

213
//this toggles the checkbox, and fires its event if it has    

$('input[type=checkbox]').trigger('click'); 
//or
$('input[type=checkbox]').click(); 

适用于Chrome 29,但不适用于FF 17.0.7,有人可以确认吗?
Griddo

我已经走了很长时间改变财产的路线。对我而言,这是一种用于检查和取消选中复选框元素的绝佳且灵活的方法。
Isioma Nnodum

触发了不需要的事件。
Jehong Ahn

对于复选框,通常建议触发“更改”事件,因为可以通过单击标签来更改它们。
Peter Lenjo

61

我知道这很老了,但是在切换过程中问题有点模棱两可可能意味着每个复选框都应该切换其状态,无论是什么状态。如果您有3个选中项和2个未选中项,则切换将使前3个处于未选中状态,而最后2个处于选中状态。

为此,这里的所有解决方案都不起作用,因为它们使所有复选框具有相同的状态,而不是切换每个复选框的状态。$(':checkbox').prop('checked')对许多复选框执行操作会在所有.checked二进制属性之间返回逻辑与,即,如果未选中其中之一,则返回的值为false

.each()如果要实际切换每个复选框状态而不是使它们都相等,则需要使用,例如

   $(':checkbox').each(function () { this.checked = !this.checked; });

请注意,您不需要$(this)在处理程序内部,因为该.checked属性存在于所有浏览器中。


5
是的,这是切换所有复选框状态的正确答案!
Sydwell

1
当您有很多复选框时,比使用jQuery触发单击要快几个数量级。
杰里米·库克

16

这是您想要的另一种方法。

$(document).ready(function(){   
    $('#checkp').toggle(
        function () { 
            $('.check').attr('Checked','Checked'); 
        },
        function () { 
            $('.check').removeAttr('Checked'); 
        }
    );
});

9
那不是在跳动。
AgentFire

2
@kst-这是更好的方法$('input [name = recipients \ [\]]')。toggle(this.checked); 忘了上课吧。
戴维斯

11

我认为只触发一次点击就更简单了:

$("#select-all-teammembers").click(function() {
    $("input[name=recipients\\[\\]]").trigger('click');
});                 

9

我能想到的最好方法。

$('#selectAll').change(function () {
    $('.reportCheckbox').prop('checked', this.checked);
});

要么

$checkBoxes = $(".checkBoxes");
$("#checkAll").change(function (e) {
    $checkBoxes.prop("checked", this.checked);
});   

要么

<input onchange="toggleAll(this)">
function toggleAll(sender) {
    $(".checkBoxes").prop("checked", sender.checked);
}



2

假设它是必须切换复选框的图像,这对我有用

<img src="something.gif" onclick="$('#checkboxid').prop('checked', !($('#checkboxid').is(':checked')));">
<input type="checkbox" id="checkboxid">

4
由于这是您的第一个答案,因此请意识到,通常最好遵循问题中使用的张贴者的模式-例如将jQuery代码放入文档就绪处理程序中,而不是将其直接插入标记中。如果您有理由不这样做,请添加原因说明。
Mark Schultheiss

2

退房所有复选框应该更新自身在一定条件下。尝试单击“#select-all-teammembers”,然后取消选中一些项目,然后再次单击全选。您会看到不一致的地方。为了防止这种情况,请使用以下技巧:

  var checkBoxes = $('input[name=recipients\\[\\]]');
  $('#select-all-teammembers').click(function() {
    checkBoxes.prop("checked", !checkBoxes.prop("checked"));
    $(this).prop("checked", checkBoxes.is(':checked'));
  }); 

顺便说一句,所有复选框DOM对象都应如上所述进行缓存。


2

这是jQuery的一种切换复选框的方法,而不必选择带有html5和标签的复选框:

 <div class="checkbox-list margin-auto">
    <label class="">Compare to Last Year</label><br>
    <label class="normal" for="01">
       <input id="01" type="checkbox" name="VIEW" value="01"> Retail units
    </label>
    <label class="normal" for="02">
          <input id="02" type="checkbox" name="VIEW" value="02">  Retail Dollars
    </label>
    <label class="normal" for="03">
          <input id="03" type="checkbox" name="VIEW" value="03">  GP Dollars
    </label>
    <label class="normal" for="04">
          <input id="04" type="checkbox" name="VIEW" value="04">  GP Percent
    </label>
</div>

  $("input[name='VIEW']:checkbox").change(function() {
    if($(this).is(':checked')) {  
         $("input[name='VIEW']:checkbox").prop("checked", false);
     $("input[name='VIEW']:checkbox").parent('.normal').removeClass("checked");
         $(this).prop("checked", true);
         $(this).parent('.normal').addClass('checked');
    }
    else{
         $("input[name='VIEW']").prop("checked", false);
         $("input[name='VIEW']").parent('.normal').removeClass('checked');
    }    
});

http://www.bootply.com/A4h6kAPshx


1

如果要单独切换每个框(或仅一个框也可以):

我建议使用.each(),因为如果您希望发生不同的事情,那么它很容易修改,并且仍然相对较短且易于阅读。

例如:

// toggle all checkboxes, not all at once but toggle each one for its own checked state:
$('input[type="checkbox"]').each(function(){ this.checked = ! this.checked });

// check al even boxes, uncheck all odd boxes:
$('input[type="checkbox"]').each(function(i,cb){ cb.checked = (i%2 == 0); });

// set all to checked = x and only trigger change if it actually changed:
x = true;
$('input[type="checkbox"]').each(function(){
    if(this.checked != x){ this.checked = x; $(this).change();}  
});

在侧面说明...不确定为什么每个人都使用.attr()或.prop()来(取消)检查内容。

据我所知,element.checked在所有浏览器中一直都一样工作吗?


1
jQuery("#checker").click(function(){
    jQuery("#mydiv :checkbox").each(function(){
        this.checked = true;
    });
});
jQuery("#dechecker").click(function(){
    jQuery("#mydiv :checkbox").each(function(){
        this.checked = false;
    });
});
jQuery("#checktoggler").click(function(){
    jQuery("#mydiv :checkbox").each(function(){
        this.checked = !this.checked;
    });
});

;)


1

你也可以这样写

$(function() {
    $("#checkbox-toggle").click(function() {
        $('input[type=checkbox][name=checkbox_id\\[\\]]').click();
    });
});

用户单击ID为“#checkbox-toggle”的按钮时,只需调用复选框的单击事件即可。


1

更好的方法和用户体验

$('.checkall').on('click', function() {
   var $checks  = $('checks');
   var $ckall = $(this);

    $.each($checks, function(){
        $(this).prop("checked", $ckall.prop('checked'));
    });
});

$('checks').on('click', function(e){
   $('.checkall').prop('checked', false);
});

1
<table class="table table-datatable table-bordered table-condensed table-striped table-hover table-responsive">
<thead>
    <tr>
        <th class="col-xs-1"><a class="select_all btn btn-xs btn-info"> Select All </a></th>
        <th class="col-xs-2">#ID</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td><input type="checkbox" name="order333"/></td>
        <td>{{ order.id }}</td>
    </tr>
    <tr>
        <td><input type="checkbox" name="order334"/></td>
        <td>{{ order.id }}</td>
    </tr>
</tbody>                  
</table>

尝试:

$(".table-datatable .select_all").on('click', function () {
    $("input[name^='order']").prop('checked', function (i, val) {
        return !val;
    });
});

1

这对我来说非常有效。

   $("#checkall").click(function() {
       var fruits = $("input[name=fruits\\[\\]]");
        fruits.prop("checked", $(this).prop("checked"));
    });

1
您确实意识到您正在为“ checked”属性赋予它已经完全相同的值,对吗?有点尴尬吗?你显然打算把!之前的标志..
VSYNC

1

最基本的示例是:

// get DOM elements
var checkbox = document.querySelector('input'),
    button = document.querySelector('button');

// bind "cilck" event on the button
button.addEventListener('click', toggleCheckbox);

// when clicking the button, toggle the checkbox
function toggleCheckbox(){
  checkbox.checked = !checkbox.checked;
};
<input type="checkbox">
<button>Toggle checkbox</button>


1

简单地你可以使用这个

$("#chkAll").on("click",function(){
    $("input[name=checkBoxName]").prop("checked",$(this).prop("checked"));
});

0

在我的猜测中,建议正常变体的最正确的人是GigolNet Gigolashvili,但我想提出更美丽的变体。核实

$(document).on('click', '.fieldWrapper > label', function(event) {
    event.preventDefault()
    var n = $( event.target ).parent().find('input:checked').length
    var m = $( event.target ).parent().find('input').length
    x = n==m? false:true
    $( event.target ).parent().find('input').each(function (ind, el) {
        // $(el).attr('checked', 'checked');
        this.checked = x
    })
})

0

分别设置'checked'或null而不是true或false即可完成工作。

// checkbox selection
var $chk=$(':checkbox');
$chk.prop('checked',$chk.is(':checked') ? null:'checked');

0

单击Web模板中使用的任何切换开关动画器时,此代码将切换复选框。替换代码中可用的“ .onoffswitch-label”。“ checkboxID”是此处切换的复选框。

$('.onoffswitch-label').click(function () {
if ($('#checkboxID').prop('checked')) 
 {
   $('#checkboxID').prop('checked', false);
 }
else 
 {
   $('#checkboxID').prop('checked', true);
 }
});

-3

好吧,有一个更简单的方法

首先给您的复选框一个类示例“ id_chk”

然后,在复选框中将控制“ id_chk”复选框的状态:

<input type='checkbox' onchange='js:jQuery(".id_chk").prop("checked", jQuery(this).prop("checked"))' />

就是这样,希望对您有所帮助

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.