Włącz / wyłącz pola wyboru


397

Mam następujące:

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

Chciałbym, aby id="select-all-teammembers"po kliknięciu przełączać między zaznaczonym a niezaznaczonym. Pomysły? to nie są dziesiątki linii kodu?

Odpowiedzi:


723

Możesz pisać:

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

Przed wersją jQuery 1.6, kiedy mieliśmy tylko attr (), a nie prop () , pisaliśmy:

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

prop()Ma jednak lepszą semantykę niż w attr()przypadku „boolowskich” atrybutów HTML, dlatego zwykle jest to preferowane w tej sytuacji.


4
Może to stać się namacalne, ponieważ opiera status na pierwszym (więc jeśli użytkownik sprawdzi pierwszy, a następnie użyje przełącznika, nie zsynchronizuje się). Nieznacznie poprawiony, aby opierał status wyłącznika, a nie pierwsze pole wyboru na liście: $ („input [name = receptients \ [\]]”). Prop („zaznaczone”, $ (this) .prop (” sprawdzone"));
— CookiesForDevo,

6
Użycie „prop” sprawia, że ​​działa to również dla Zepto. W przeciwnym razie zaznaczy to pole, ale go nie odznaczy.
— SimplGy,

1
„prop” zamiast „attr” załatwiło sprawę: z „attr” przełącza się na chwilę, a następnie zatrzymuje się, z „prop” zamiast tego przełącza się zgodnie z oczekiwaniami. +1 za aktualizację.
— TechNyquist,

11
$('input[type=checkbox]').trigger('click');wspomniane przez @ 2astalavista poniżej jest bardziej zwięzłe i powoduje również zdarzenie „zmiany”.
— tutaj

1
czy możesz edytować swoją odpowiedź, aby wesprzeć odpowiedź @
— CookiesForDevo

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

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

Działa w chrome 29, ale nie w FF 17.0.7, czy ktoś może to potwierdzić?
— Griddo

Tak długo szedłem drogą zmiany posiadłości. Dla mnie jest to świetne i bardziej elastyczne podejście do sprawdzania i odznaczania elementów pól wyboru.
— Isioma Nnodum

Niepożądane zdarzenie jest wyzwalane.
— Jehong Ahn

W przypadku pól wyboru na ogół bardziej wskazane jest uruchomienie zdarzenia „zmień”, ponieważ można je zmienić, klikając etykietę.
— Peter Lenjo

61

Wiem, że to stare, ale pytanie było nieco dwuznaczne, ponieważ przełączanie może oznaczać, że każde pole wyboru powinno przełączać swój stan, cokolwiek to jest. Jeśli masz 3 zaznaczone, a 2 niezaznaczone, przełączenie spowoduje, że pierwsze 3 pozostaną niezaznaczone, a ostatnie 2 zaznaczone.

W tym celu żadne z rozwiązań tutaj nie działa, ponieważ powodują, że wszystkie pola wyboru mają ten sam stan, zamiast przełączać stan każdego pola wyboru. Wykonanie $(':checkbox').prop('checked')wielu pól wyboru zwraca logiczne AND między wszystkimi .checkedwłaściwościami binarnymi, tzn. Jeśli jedna z nich nie jest zaznaczona, zwracana jest wartośćfalse .

Musisz użyć, .each()jeśli chcesz przełączyć każdy stan pola wyboru zamiast zrównać je wszystkie, np

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

Pamiętaj, że nie musisz korzystać z $(this)modułu obsługi, ponieważ .checkedwłaściwość istnieje we wszystkich przeglądarkach.


5
Tak, to poprawna odpowiedź na przełączanie stanu wszystkich pól wyboru!
— Sydwell

1
Rząd wielkości szybciej niż uruchamianie kliknięcia za pomocą jQuery, gdy masz wiele pól wyboru.
— Jeremy Cook

16

Oto inny sposób, który chcesz.

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

9
To nie jest przełączanie.
— AgentFire,

2
@kst - To jest lepsza metoda $ ('input [name = receients \ [\]]'). toggle (this.checked); Zapomnij o zajęciach.
— Davis

11

Myślę, że łatwiej jest po prostu uruchomić kliknięcie:

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

9

Najlepszy sposób, jaki mogę wymyślić.

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

lub

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

lub

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

8

Od jQuery 1.6 możesz użyć .prop(function)do przełączania sprawdzonego stanu każdego znalezionego elementu:

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

Doskonała odpowiedź. Czy zdarza ci się wiedzieć więcej o przekazywaniu podkreślenia jako pierwszego parametru? Gdzie mogę dowiedzieć się więcej na ten temat?
— user1477388,

1
Edycja: Najwyraźniej jest to zasadniczo sposób na przekazanie wartości zerowej stackoverflow.com/questions/11406823/…
— user1477388

8

Użyj tej wtyczki:

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

   }

Następnie

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

2

Zakładając, że jest to obraz, który musi przełączać pole wyboru, działa to dla mnie

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

4
Ponieważ jest to Twoja pierwsza odpowiedź, zdaj sobie sprawę, że najczęściej najlepiej jest podążać za wzorem użytym w pytaniu - na przykład umieszczając kod jQuery w module obsługi dokumentów, a nie bezpośrednio w znacznikach. JEŚLI masz powód, aby tego NIE robić, dodaj wyjaśnienie, dlaczego.
— Mark Schultheiss

2

Sprawdź wszystko pole powinno zostać zaktualizowane się pod pewnymi warunkami. Spróbuj kliknąć „# select-all-teammembers”, a następnie odznacz kilka elementów i kliknij ponownie select-all. Możesz zobaczyć niespójność. Aby temu zapobiec, użyj następującej sztuczki:

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

BTW wszystkie pola wyboru Obiekt DOM powinien być buforowany zgodnie z powyższym opisem.


2

Oto jQuery sposób przełączania pól wyboru bez konieczności zaznaczania pola wyboru za pomocą html5 i etykiet:

 <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

jeśli chcesz przełączać poszczególne pola osobno (lub tylko jedno pole działa równie dobrze):

Polecam użycie .each (), ponieważ jest łatwa do modyfikacji, jeśli chcesz, aby wydarzyły się różne rzeczy, a jednocześnie stosunkowo krótka i łatwa do odczytania.

np .:

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

na marginesie ... nie jestem pewien, dlaczego wszyscy używają .attr () lub .prop () do (od) sprawdzania rzeczy.

o ile wiem, element.checked zawsze działał tak samo we wszystkich przeglądarkach?


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

Możesz także tak pisać

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

Wystarczy wywołać zdarzenie kliknięcia pola wyboru, gdy użytkownik kliknie przycisk o identyfikatorze „# checkbox-toggle”.


1

Lepsze podejście i 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>

Próbować:

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

1

Ten działa dla mnie bardzo dobrze.

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

1
zdajesz sobie sprawę, że nadajesz właściwości „zaznaczonej” dokładnie taką samą wartość, jaką już ma, prawda? czy to nie jest trochę zawstydzające? najwyraźniej chciałeś postawić !przed tym znak ...
— vsync,

1

Najbardziej podstawowym przykładem byłoby:

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

po prostu możesz tego użyć

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

0

Myślę, że najodpowiedniejszym człowiekiem, który zaproponował normalny wariant, jest GigolNet Gigolashvili, ale chcę zaproponować jeszcze piękniejszy wariant. Sprawdź to

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

Ustawienie „zaznaczone” lub null zamiast odpowiednio prawda lub fałsz wykona pracę.

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

0

Ten kod przełącza pole wyboru po kliknięciu dowolnego animatora przełączania przełącznika używanego w szablonach internetowych. Zamień „.onoffswitch-label” na dostępne w kodzie. „checkboxID” to pole wyboru przełączane tutaj.

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

-3

Jest łatwiejszy sposób

Najpierw daj swoim polom wyboru przykład klasy „id_chk”

Następnie wewnątrz pola wyboru, które będzie kontrolować stan pól wyboru id_chk:

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

To wszystko, mam nadzieję, że to pomoże

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.