Aktivieren / Deaktivieren der Kontrollkästchen


397

Ich habe folgendes:

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

Ich möchte, dass id="select-all-teammembers"beim Klicken zwischen aktiviert und deaktiviert umgeschaltet wird. Ideen? das sind nicht Dutzende von Codezeilen?

Antworten:


723

Du kannst schreiben:

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

Vor jQuery 1.6, als wir nur attr () und nicht prop () hatten , haben wir geschrieben:

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

Hat aber prop()eine bessere Semantik als attr()bei Anwendung auf "boolesche" HTML-Attribute, so dass dies in dieser Situation normalerweise bevorzugt wird.


4
Dies kann sehr schwierig werden, da der Status auf dem ersten basiert (wenn der Benutzer also den ersten überprüft und dann den Umschalter verwendet, ist er nicht mehr synchron). Leicht angepasst, damit der Status vom Umschalter abhängt, nicht vom ersten Kontrollkästchen in der Liste: $ ("Eingabe [Name = Empfänger \ [\]]"). Prop ("markiert", $ (this) .prop (" markiert "));
CookiesForDevo

6
Mit 'prop' funktioniert dies auch für Zepto. Andernfalls wird das Kontrollkästchen aktiviert, aber nicht deaktiviert.
Einfach

1
"prop" anstelle von "attr" hat den Trick gemacht: mit "attr" schaltet es für eine Weile um und stoppt dann, mit "prop" schaltet es stattdessen wie erwartet um. +1 für das Update.
TechNyquist

11
$('input[type=checkbox]').trigger('click');Das von @ 2astalavista unten erwähnte ist prägnanter und löst auch das "change" -Ereignis aus.
hier

1
Könnten Sie Ihre Antwort bearbeiten, um @ CookiesForDevos Antwort zu unterstützen
Acquayefrank

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

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

Funktioniert in Chrome 29, aber nicht in FF 17.0.7. Kann jemand das bestätigen?
Griddo

Ich war schon so lange auf dem Weg, das Eigentum zu wechseln. Für mich ist dies ein großartiger und flexiblerer Ansatz zum Aktivieren und Deaktivieren von Kontrollkästchenelementen.
Isioma Nnodum

Unerwünschtes Ereignis wird ausgelöst.
Jehong Ahn

Bei Kontrollkästchen ist es im Allgemeinen ratsamer, das Ereignis "Ändern" auszulösen, da sie durch Klicken auf eine Beschriftung geändert werden können.
Peter Lenjo

61

Ich weiß, dass dies alt ist, aber die Frage war etwas mehrdeutig, da das Umschalten bedeuten kann, dass jedes Kontrollkästchen seinen Status umschalten sollte, was auch immer das ist. Wenn Sie 3 aktiviert und 2 deaktiviert haben, werden beim Umschalten die ersten 3 deaktiviert und die letzten 2 aktiviert.

Aus diesem Grund funktioniert keine der hier aufgeführten Lösungen, da alle Kontrollkästchen denselben Status haben, anstatt den Status jedes Kontrollkästchens umzuschalten. Doing $(':checkbox').prop('checked')auf viele Kontrollkästchen gibt die logische UND - Verknüpfung zwischen allen .checkedbinären Eigenschaften, dh wenn eine von ihnen nicht markiert ist, ist der zurückgegebene Wert false.

Sie müssen verwenden, .each()wenn Sie tatsächlich jeden Kontrollkästchenstatus umschalten möchten, anstatt alle gleich zu machen, z

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

Beachten Sie, dass Sie $(this)den Handler nicht benötigen, da die .checkedEigenschaft in allen Browsern vorhanden ist.


5
Ja, dies ist die richtige Antwort, um den Status aller Kontrollkästchen umzuschalten!
Sydwell

1
Größenordnungen schneller als das Auslösen eines Klicks mit jQuery, wenn Sie viele Kontrollkästchen haben.
Jeremy Cook

16

Hier ist ein anderer Weg, den Sie wollen.

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

9
Das wechselt nicht.
AgentFire

2
@kst - Dies ist eine bessere Methode $ ('input [name = Empfänger \ [\]]'). toggle (this.checked); Vergiss die Klassen.
Davis

11

Ich denke, es ist einfacher, nur einen Klick auszulösen:

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

9

Der beste Weg, den ich mir vorstellen kann.

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

oder

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

oder

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

8

Seit jQuery 1.6 können Sie .prop(function)den aktivierten Status jedes gefundenen Elements umschalten:

$("input[name=recipients\\[\\]]").prop('checked', function(_, checked) {
    return !checked;
});

Hervorragende Antwort. Wissen Sie zufällig mehr darüber, wie Sie den Unterstrich als ersten Parameter übergeben? Wo könnte ich mehr darüber erfahren?
user1477388

1
Bearbeiten: Anscheinend ist es im Wesentlichen ein Mittel, um null stackoverflow.com/questions/11406823/…
user1477388

8

Verwenden Sie dieses Plugin:

$.fn.toggleCheck  =function() {
       if(this.tagName === 'INPUT') {
           $(this).prop('checked', !($(this).is(':checked')));
       }

   }

Dann

$('#myCheckBox').toggleCheck();

2

Angenommen, es ist ein Bild, das das Kontrollkästchen umschalten muss, funktioniert dies für mich

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

4
Da dies Ihre erste Antwort ist, sollten Sie sich darüber im Klaren sein, dass es am besten ist, dem Muster des in der Frage verwendeten Posters zu folgen - beispielsweise den jQuery-Code in den Document Ready-Handler einzufügen und nicht in das Markup einzubinden. Wenn Sie einen Grund haben, dies NICHT zu tun, fügen Sie eine Erklärung hinzu, warum.
Mark Schultheiss

2

Das Kontrollkästchen Alles aktivieren sollte unter bestimmten Bedingungen selbst aktualisiert werden. Versuchen Sie, auf "# Alle Teammitglieder auswählen" zu klicken , deaktivieren Sie dann einige Elemente und klicken Sie erneut auf "Alle auswählen" . Sie können Inkonsistenzen sehen. Verwenden Sie den folgenden Trick, um dies zu verhindern:

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

Übrigens sollten alle Kontrollkästchen DOM-Objekt wie oben beschrieben zwischengespeichert werden.


2

Hier ist eine jQuery-Methode zum Umschalten von Kontrollkästchen, ohne ein Kontrollkästchen mit HTML5 und Labels aktivieren zu müssen:

 <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

Wenn Sie jede Box einzeln umschalten möchten (oder nur eine Box funktioniert genauso gut):

Ich empfehle die Verwendung von .each (), da es leicht zu ändern ist, wenn verschiedene Dinge passieren sollen, und dennoch relativ kurz und leicht zu lesen ist.

z.B :

// 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();}  
});

Nebenbei bemerkt ... ich bin mir nicht sicher, warum jeder .attr () oder .prop () verwendet, um Dinge zu (un) überprüfen.

Soweit ich weiß, hat element.checked in allen Browsern immer gleich funktioniert?


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

Sie können auch so schreiben

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

Sie müssen nur das Kontrollkästchen Klickereignis aufrufen, wenn der Benutzer auf die Schaltfläche mit der ID '# checkbox-toggle' klickt.


1

Ein besserer Ansatz und UX

$('.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>

Versuchen:

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

1

Dieser funktioniert sehr gut für mich.

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

1
Sie erkennen, dass Sie der "geprüften" Eigenschaft genau den Wert geben, den sie bereits hat, oder? ist es nicht ein bisschen peinlich? Sie !
wollten

1

Das grundlegendste Beispiel wäre:

// 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

Sie können dies einfach verwenden

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

0

Meiner Meinung nach ist GigolNet Gigolashvili der richtige Mann, der eine normale Variante vorgeschlagen hat, aber ich möchte eine noch schönere Variante vorschlagen. prüfen Sie

$(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

Das Setzen von 'markiert' oder null anstelle von wahr oder falsch erledigt die Arbeit.

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

0

Dieser Code schaltet das Kontrollkästchen um, wenn Sie auf einen in Webvorlagen verwendeten Kippschalter-Animator klicken. Ersetzen Sie ".onoffswitch-label", wie in Ihrem Code verfügbar. "checkboxID" ist das hier umgeschaltete Kontrollkästchen.

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

-3

Nun, es gibt einen einfacheren Weg

Geben Sie Ihren Kontrollkästchen zunächst ein Klassenbeispiel 'id_chk'.

Dann in das Kontrollkästchen, das den Status der Kontrollkästchen 'id_chk' steuert:

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

Das ist alles, hoffe das hilft

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.