Impostazione "selezionata" per una casella di controllo con jQuery


4132

Mi piacerebbe fare qualcosa del genere per spuntare checkboxusando jQuery :

$(".myCheckBox").checked(true);

o

$(".myCheckBox").selected(true);

Esiste una cosa del genere?


Una domanda più specifica (e molto utile!), "Come posso controllare un elemento in una casella di controllo PER VALORE?", Penso che possiamo anche discutere qui, e ho pubblicato una risposta qui sotto.
Peter Krauss,

Controllare gli altri modi per farlo utilizzando jQuery qui stackoverflow.com/a/22019103/1868660
Subodh Ghulaxe

Se hai bisogno dell'evento onchange attivato, è$("#mycheckbox").click();
HumanInDisguise

"Controllare qualcosa" suggerisce di provarlo, quindi penso che "Fare una casella di controllo selezionata" sia un titolo più chiaro e migliore.
Alireza,

puntello(); la funzione è la risposta perfetta. Vedi la definizione della funzione - api.jquery.com/prop
yogihosting

Risposte:


5969

JQuery moderno

Utilizzare .prop():

$('.myCheckbox').prop('checked', true);
$('.myCheckbox').prop('checked', false);

API DOM

Se lavori con un solo elemento, puoi sempre accedere al sottostante HTMLInputElemente modificarne la .checkedproprietà:

$('.myCheckbox')[0].checked = true;
$('.myCheckbox')[0].checked = false;

Il vantaggio di usare i metodi .prop()e .attr()invece di questo è che funzioneranno su tutti gli elementi corrispondenti.

jQuery 1.5.xo inferiore

Il .prop()metodo non è disponibile, quindi è necessario utilizzare .attr().

$('.myCheckbox').attr('checked', true);
$('.myCheckbox').attr('checked', false);

Si noti che questo è l'approccio utilizzato dai test unitari di jQuery precedenti alla versione 1.6 ed è preferibile utilizzarlo $('.myCheckbox').removeAttr('checked');poiché quest'ultimo, se la casella è stata inizialmente selezionata, cambierà il comportamento di una chiamata .reset()su qualsiasi modulo che la contenga: un metodo sottile ma probabilmente cambiamento di comportamento indesiderato.

Per ulteriori contesti, alcune discussioni incomplete sulle modifiche alla gestione checkeddell'attributo / proprietà nella transizione da 1.5.xa 1.6 sono disponibili nelle note di rilascio della versione 1.6 e nella sezione Attributi vs. Proprietà della .prop()documentazione .


26
@Xian la rimozione dell'attributo controllato rende impossibile reimpostare il modulo
mcgrailm

6
Come nota a margine, jQuery 1.6.1 dovrebbe risolvere il problema che ho citato, quindi possiamo tecnicamente tornare a usare $ (...). Prop (...)
cwharris,

19
"Se lavori con un solo elemento, sarà sempre più veloce da usare DOMElement.checked = true". Ma sarebbe trascurabile, perché è solo un elemento ...
Tyler Crompton

46
Come dice Tyler, si tratta di un miglioramento trascurabile delle prestazioni. Per me, la codifica mediante un'API comune la rende più leggibile rispetto alla combinazione di API native e API jQuery. Continuerei con jQuery.
Charlie Kilian,

18
@TylerCrompton - Certo, non si tratta solo di prestazioni, ma fare $(element).prop('checked')è uno spreco completo di battitura. element.checkedesiste e dovrebbe essere usato nei casi in cui hai giàelement
gnarf

705

Uso:

$(".myCheckbox").attr('checked', true); // Deprecated
$(".myCheckbox").prop('checked', true);

E se vuoi controllare se una casella è selezionata o meno:

$('.myCheckbox').is(':checked');

4
anche $ (selettore) .checked per verificare è selezionato
eomeroff

6
Ho provato questo codice esatto e non ha funzionato per me nel caso di una casella di controllo Seleziona tutto / Seleziona nessuno che deve selezionare e deselezionare tutto e controllare il loro stato. Invece, ho provato la risposta di @Christopher Harris e questo ha funzionato.
JD Smith,

Perché usare "form #mycheckbox" anziché semplicemente "#mycheckbox"? L'id è già unico nell'intero documento, è più veloce e più semplice sceglierlo direttamente.
YuriAlbuquerque,

@YuriAlbuquerque è stato un esempio. puoi usare qualunque selettore tu voglia.
bchhun,

5
$ (selettore) .controllato non funziona. Non esiste un metodo "controllato" in jQuery.
Brendan Byrd,

318

Questo è il modo corretto di selezione o la deselezione caselle con jQuery, come è standard multi-piattaforma, e vi permetterà ripubblica modulo.

$('.myCheckBox').each(function(){ this.checked = true; });

$('.myCheckBox').each(function(){ this.checked = false; });

In questo modo, stai utilizzando gli standard JavaScript per selezionare e deselezionare le caselle di controllo, quindi qualsiasi browser che implementa correttamente la proprietà "selezionata" dell'elemento checkbox eseguirà questo codice in modo impeccabile. Questo dovrebbe essere tutti i principali browser, ma sono in grado di testare precedente a Internet Explorer 9.

Il problema (jQuery 1.6):

Quando un utente fa clic su una casella di controllo, quella casella di controllo smette di rispondere alle modifiche dell'attributo "selezionato".

Ecco un esempio dell'attributo della casella di controllo che non riesce a fare il lavoro dopo che qualcuno ha fatto clic sulla casella di controllo (ciò accade in Chrome).

Violino

La soluzione:

Usando la proprietà "controllata" di JavaScript sugli elementi DOM , siamo in grado di risolvere direttamente il problema, invece di provare a manipolare il DOM nel fare ciò che vogliamo che faccia.

Violino

Questo plugin altererà la proprietà selezionata di tutti gli elementi selezionati da jQuery e selezionerà e deselezionerà le caselle di controllo in tutte le circostanze. Pertanto, sebbene possa sembrare una soluzione vincente, migliorerà l'esperienza utente del tuo sito e contribuirà a prevenire la frustrazione dell'utente.

(function( $ ) {
    $.fn.checked = function(value) {
        if(value === true || value === false) {
            // Set the value of the checkbox
            $(this).each(function(){ this.checked = value; });
        } 
        else if(value === undefined || value === 'toggle') {
            // Toggle the checkbox
            $(this).each(function(){ this.checked = !this.checked; });
        }

        return this;
    };
})( jQuery );

In alternativa, se non si desidera utilizzare un plug-in, è possibile utilizzare i seguenti frammenti di codice:

// Check
$(':checkbox').prop('checked', true);

// Un-check
$(':checkbox').prop('checked', false);

// Toggle
$(':checkbox').prop('checked', function (i, value) {
    return !value;
});

5
Nel tuo primo esempio di JSFiddle dovresti usare removeAttr('checked')piuttosto cheattr('checked', false)
Daniel X Moore il

4
@DanielXMoore, Stai aggirando il problema. L'esempio è stato quello di mostrare che una volta che la casella di controllo è stata selezionata dall'utente, il browser non risponde più alle checkedmodifiche degli attributi, indipendentemente dal metodo utilizzato per modificarle.
cwharris,

3
@ChristopherHarris Ok, hai ragione, mi sono perso. A partire da jQuery 1.6 non dovresti usare il metodo .prop? $('.myCheckBox').prop('checked', true)In questo modo si applicherà automaticamente all'intero set di elementi corrispondenti (solo quando si imposta, tuttavia, ottenere è ancora solo il primo)
Daniel X Moore,

Sì. propè sicuramente il modo appropriato per impostare gli attributi su un elemento.
cwharris,

@ChristopherHarris, ho aggiunto al plugin ciò di cui avevo bisogno per consentire una certa flessibilità dei parametri. Ciò ha reso più semplice l'elaborazione in linea senza la conversione del tipo. Esp da database diversi con "idee" su cosa sia "vero". Fiddle: jsfiddle.net/Cyberjetx/vcp96
Joe Johnston

147

Tu puoi fare

$('.myCheckbox').attr('checked',true) //Standards compliant

o

$("form #mycheckbox").attr('checked', true)

Se hai un codice personalizzato nell'evento onclick per la casella di controllo che vuoi attivare, usa invece questo:

$("#mycheckbox").click();

Puoi deselezionare rimuovendo completamente l'attributo:

$('.myCheckbox').removeAttr('checked')

Puoi selezionare tutte le caselle di controllo in questo modo:

$(".myCheckbox").each(function(){
    $("#mycheckbox").click()
});

puoi anche andare $ ("# myTable input: checkbox"). each (...);
Chris Brandsma,

Puoi anche andare$(".myCheckbox").click()
RobertPitt il

3
@Michah rimuovendo l'attributo controllato rende impossibile resettare il modulo
mcgrailm

12
Questa risposta non è aggiornata perché utilizza .attrinvece di .prop.
Blazemonger,

$("#mycheckbox").click();ha lavorato per me come stavo ascoltando evento di modifica troppo e .attr& .propnon è scattato evento di modifica.
Damodar Bashyal,

80

Puoi anche estendere l'oggetto $ .fn con nuovi metodi:

(function($)  {
   $.fn.extend({
      check : function()  {
         return this.filter(":radio, :checkbox").attr("checked", true);
      },
      uncheck : function()  {
         return this.filter(":radio, :checkbox").removeAttr("checked");
      }
   });
}(jQuery));

Quindi puoi semplicemente fare:

$(":checkbox").check();
$(":checkbox").uncheck();

Oppure potresti voler dare loro nomi più unici come mycheck () e myuncheck () nel caso in cui usi qualche altra libreria che usa quei nomi.


5
@ livfree75 la rimozione dell'attributo controllato rende impossibile reimpostare il modulo
mcgrailm

5
Questa risposta non è aggiornata perché utilizza .attrinvece di .prop.
Blazemonger,

64
$("#mycheckbox")[0].checked = true;
$("#mycheckbox").attr('checked', true);
$("#mycheckbox").click();

L'ultimo genererà l'evento click per la casella di controllo, gli altri no. Quindi se hai un codice personalizzato nell'evento onclick per la casella di controllo che vuoi attivare, usa l'ultimo.


4
il primo fallirà ... controllato non è un membro dell'oggetto jquery
redsquare

5
Questa risposta non è aggiornata perché utilizza .attrinvece di .prop.
Blazemonger,

IMO l' clickevento non è affidabile in Firefox e Edge.
Vahid Amiri,

62

Per selezionare una casella che dovresti usare

 $('.myCheckbox').attr('checked',true);

o

 $('.myCheckbox').attr('checked','checked');

e per deselezionare una casella di controllo dovresti sempre impostarla su false:

 $('.myCheckbox').attr('checked',false);

Se fate

  $('.myCheckbox').removeAttr('checked')

rimuove l'attributo tutti insieme e pertanto non sarà possibile reimpostare il modulo.

BAD DEMO jQuery 1.6 . Penso che questo sia rotto. Per 1.6 farò un nuovo post su questo.

NUOVA DEMO DI LAVORO jQuery 1.5.2 funziona in Chrome.

Entrambe le demo usano

$('#tc').click(function() {
    if ( $('#myCheckbox').attr('checked')) {
        $('#myCheckbox').attr('checked', false);
    } else {
        $('#myCheckbox').attr('checked', 'checked');
    }
});

1
Questo è inaccurato. l'impostazione dell'attributo 'controllato' su '' non deselezionerà le caselle di controllo in almeno Chrome.
cwharris,

@xixonia Ho fatto il test prima di pubblicare il tuo violino non funziona perché non hai cambiato il menu a sinistra per includere jquery
mcgrailm

1
mcgralim - in 1.6 è ancora più facile .... $(".mycheckbox").prop("checked", true/false)
gnarf,

2
@MarkAmery hai detto che il mio post non ha aggiunto nulla al momento della pubblicazione, ma che è accurato. Se guardi la cronologia della risposta accettata scoprirai che suggeriscono di rimuovere l'elemento. Il che rende impossibile ripristinare il modulo, motivo per cui ho postato all'inizio.
Mcgrailm,

1
@mcgrailm Sono andato avanti e ho modificato la risposta accettata alla luce delle tue osservazioni. Se ti va di darci un'occhiata e controllare che abbia un bell'aspetto nel suo stato attuale, lo apprezzerei. Mi scuso ancora per aver offerto critiche acute che erano, almeno in parte, altamente fuorvianti.
Mark Amery

51

Questo seleziona gli elementi che hanno l'attributo specificato con un valore contenente la sottostringa "ckbItem" fornita:

$('input[name *= ckbItem]').prop('checked', true);

Seleziona tutti gli elementi che contengono ckbItem nel suo attributo name.


46

Supponendo che la domanda sia ...

Come posso selezionare una casella di controllo PER VALORE?

Ricorda che in un tipico set di caselle di controllo, tutti i tag di input hanno lo stesso nome, differiscono per l'attributovalue : non ci sono ID per ogni input del set.

La risposta di Xian può essere estesa con un selettore più specifico , usando la seguente riga di codice:

$("input.myclass[name='myname'][value='the_value']").prop("checked", true);

45

Mi manca la soluzione. Userò sempre:

if ($('#myCheckBox:checked').val() !== undefined)
{
    //Checked
}
else
{
    //Not checked
}

3
Questo non risponde alla domanda (la domanda riguarda l' impostazione di una casella di spunta, non la determinazione di una casella di spunta). È anche un modo piuttosto brutto di determinare se la casella di controllo è selezionata (per prima cosa, stai sfruttando il fatto non evidente che .val()tornerà sempre undefinedquando chiamato su 0 elementi per rilevare che un oggetto jQuery è vuoto, quando potresti è sufficiente controllarlo .lengthinvece) - consultare stackoverflow.com/questions/901712/… per approcci più leggibili.
Mark Amery,

42

Per selezionare una casella di controllo utilizzando jQuery 1.6 o versioni successive, procedi come segue:

checkbox.prop('checked', true);

Per deselezionare, utilizzare:

checkbox.prop('checked', false);

Ecco cosa mi piace usare per attivare / disattivare una casella di controllo utilizzando jQuery:

checkbox.prop('checked', !checkbox.prop('checked'));

Se stai usando jQuery 1.5 o precedente:

checkbox.attr('checked', true);

Per deselezionare, utilizzare:

checkbox.attr('checked', false);

37

Ecco un modo per farlo senza jQuery

function addOrAttachListener(el, type, listener, useCapture) {
  if (el.addEventListener) {
    el.addEventListener(type, listener, useCapture);
  } else if (el.attachEvent) {
    el.attachEvent("on" + type, listener);
  }
};

addOrAttachListener(window, "load", function() {
  var cbElem = document.getElementById("cb");
  var rcbElem = document.getElementById("rcb");
  addOrAttachListener(cbElem, "click", function() {
    rcbElem.checked = cbElem.checked;
  }, false);
}, false);
<label>Click Me!
  <input id="cb" type="checkbox" />
</label>
<label>Reflection:
  <input id="rcb" type="checkbox" />
</label>


31

Ecco il codice per spuntato e deselezionato con un pulsante:

var set=1;
var unset=0;
jQuery( function() {
    $( '.checkAll' ).live('click', function() {
        $( '.cb-element' ).each(function () {
            if(set==1){ $( '.cb-element' ).attr('checked', true) unset=0; }
            if(set==0){ $( '.cb-element' ).attr('checked', false); unset=1; }
        });
        set=unset;
    });
});

Aggiornamento: Ecco lo stesso blocco di codice che utilizza il più recente metodo prop Jquery 1.6+, che sostituisce attr:

var set=1;
var unset=0;
jQuery( function() {
    $( '.checkAll' ).live('click', function() {
        $( '.cb-element' ).each(function () {
            if(set==1){ $( '.cb-element' ).prop('checked', true) unset=0; }
            if(set==0){ $( '.cb-element' ).prop('checked', false); unset=1; }
        });
        set=unset;
    });
});

4
Questa risposta non è aggiornata perché utilizza .attrinvece di .prop.
Blazemonger,

30

Prova questo:

$('#checkboxid').get(0).checked = true;  //For checking

$('#checkboxid').get(0).checked = false; //For unchecking

29

Possiamo usare elementObjectcon jQuery per verificare l'attributo:

$(objectElement).attr('checked');

Possiamo usarlo per tutte le versioni di jQuery senza errori.

Aggiornamento: Jquery 1.6+ ha il nuovo metodo prop che sostituisce attr, ad esempio:

$(objectElement).prop('checked');

2
Questa risposta non è aggiornata perché utilizza .attrinvece di .prop.
Blazemonger,

25

Se stai usando PhoneGap per lo sviluppo di applicazioni e hai un valore sul pulsante che vuoi mostrare all'istante, ricordati di farlo

$('span.ui-[controlname]',$('[id]')).text("the value");

Ho scoperto che senza l'intervallo, l'interfaccia non si aggiornerà, qualunque cosa tu faccia.


25

Ecco il codice e la demo su come selezionare più caselle di controllo ...

http://jsfiddle.net/tamilmani/z8TTt/

$("#check").on("click", function () {

    var chk = document.getElementById('check').checked;
    var arr = document.getElementsByTagName("input");

    if (chk) {
        for (var i in arr) {
            if (arr[i].name == 'check') arr[i].checked = true;
        }
    } else {
        for (var i in arr) {
            if (arr[i].name == 'check') arr[i].checked = false;
        }
    }
});

- 1; mescolare selettori jQuery come $("#check")con chiamate API DOM non elaborate come document.getElementsByTagName("input")mi sembra inelegante, specialmente dato che i forloop qui potrebbero essere evitati usando .prop(). Indipendentemente da ciò, questa è un'altra risposta tardiva che non aggiunge nulla di nuovo.
Mark Amery,

20

Un'altra possibile soluzione:

    var c = $("#checkboxid");
    if (c.is(":checked")) {
         $('#checkboxid').prop('checked', false);
    } else {
         $('#checkboxid').prop('checked', true);
    }

19

Come diceva @ livefree75:

jQuery 1.5.xo inferiore

Puoi anche estendere l'oggetto $ .fn con nuovi metodi:

(function($)  {
   $.fn.extend({
      check : function()  {
         return this.filter(":radio, :checkbox").attr("checked", true);
      },
      uncheck : function()  {
         return this.filter(":radio, :checkbox").removeAttr("checked");
      }
   });
}(jQuery));

Ma nelle nuove versioni di jQuery, dobbiamo usare qualcosa del genere:

jQuery 1.6+

    (function($)  {
       $.fn.extend({
          check : function()  {
             return this.filter(":radio, :checkbox").prop("checked", true);
          },
          uncheck : function()  {
             return this.filter(":radio, :checkbox").prop("checked",false);
          }
       });
    }(jQuery));

Quindi puoi semplicemente fare:

    $(":checkbox").check();
    $(":checkbox").uncheck();

18

Se si utilizza il dispositivo mobile e si desidera che l'interfaccia si aggiorni e mostri la casella di controllo deselezionata, utilizzare quanto segue:

$("#checkbox1").prop('checked', false).checkboxradio("refresh");

18

Prestare attenzione alle perdite di memoria in Internet Explorer prima di Internet Explorer 9 , come indicato nella documentazione di jQuery :

In Internet Explorer precedente alla versione 9, l'utilizzo di .prop () per impostare una proprietà dell'elemento DOM su un valore diverso da un semplice valore di base (numero, stringa o booleano) può causare perdite di memoria se la proprietà non viene rimossa (utilizzando .removeProp ( )) prima che l'elemento DOM venga rimosso dal documento. Per impostare in modo sicuro valori su oggetti DOM senza perdite di memoria, utilizzare .data ().


2
Questo è irrilevante, poiché tutte le risposte (corrette) usano .prop('checked',true).
Blazemonger,

Non sono sicuro di aver compreso il tuo commento, che esiste ancora nella documentazione di jQuery. Stai insinuando che non vi è alcuna perdita di memoria in IE <9?
naor

2
Non vi è alcuna perdita di memoria in questo caso, poiché lo stiamo impostando su un valore primitivo semplice (booleano).
Blazemonger,

18

Per jQuery 1.6+

$('.myCheckbox').prop('checked', true);
$('.myCheckbox').prop('checked', false);

Per jQuery 1.5.xo inferiore

$('.myCheckbox').attr('checked', true);
$('.myCheckbox').attr('checked', false);

Controllare,

$('.myCheckbox').removeAttr('checked');

17

Per selezionare e deselezionare

$('.myCheckbox').prop('checked', true);
$('.myCheckbox').prop('checked', false);

3
- 1; questo non aggiunge alcun valore a un thread già gonfio. Il codice qui è esattamente lo stesso della risposta accettata.
Mark Amery,

16
$('controlCheckBox').click(function(){
    var temp = $(this).prop('checked');
    $('controlledCheckBoxes').prop('checked', temp);
});

4
- 1 per essere una risposta solo in codice, non rispondere direttamente alla domanda e non aggiungere nulla che altre risposte non avevano già coperto.
Mark Amery,

15

Questa è probabilmente la soluzione più breve e semplice:

$(".myCheckBox")[0].checked = true;

o

$(".myCheckBox")[0].checked = false;

Ancora più breve sarebbe:

$(".myCheckBox")[0].checked = !0;
$(".myCheckBox")[0].checked = !1;

Ecco anche un jsFiddle .


14

Il semplice JavaScript è molto semplice e molto meno costoso:

var elements = document.getElementsByClassName('myCheckBox');
for(var i = 0; i < elements.length; i++)
{
    elements[i].checked = true;
}

Esempio qui


@MarkAmery La risposta accettata non copre come farlo senza jQuery. La mia risposta aggiunge un vantaggio supplementare alla risposta accettata.
Alex W,

13

Non riuscivo a farlo funzionare usando:

$("#cb").prop('checked', 'true');
$("#cb").prop('checked', 'false');

Sia vero che falso verrebbe spuntata la casella. Ciò che ha funzionato per me è stato:

$("#cb").prop('checked', 'true'); // For checking
$("#cb").prop('checked', '');     // For unchecking

16
non dovrebbe essere truee falsee non 'true'e 'false'?
potenza

9
"Non ha funzionato" perché è 'false'stato convertito in valore booleano che ha provocato true- la stringa vuota viene valutata in falsemodo da "funzionare". Vedi questo violino per esempio di cosa intendo.
Shadow Wizard is Ear For You,

@ chris97ong Ho ripristinato la tua modifica; quando qualcuno dice "Non usare il codice qui sotto perché non funziona", correggere quel codice lasciando il commento dicendo che non funziona è dannoso, specialmente quando interrompe la spiegazione nei commenti del perché il codice non è non funziona. Detto questo, questa risposta è ancora un po 'confusa e merita un downvote per le ragioni fornite da tpower e ShadowWizard.
Mark Amery,

1
usa valori true e false per il valore booleano, non utilizzare "true" o "false" (stringhe).
Jone Polvora,

13

Quando hai spuntato una casella come;

$('.className').attr('checked', 'checked')

potrebbe non essere abbastanza. Dovresti anche chiamare la seguente funzione;

$('.className').prop('checked', 'true')

Soprattutto quando hai rimosso l'attributo checkbox check.


11

Ecco la risposta completa usando jQuery

Lo collaudo e funziona al 100%: D

    // when the button (select_unit_button) is clicked it returns all the checed checkboxes values 
    $("#select_unit_button").on("click", function(e){

             var arr = [];

             $(':checkbox:checked').each(function(i){
                 arr[i] = $(this).val(); // u can get id or anything else
             });

              //console.log(arr); // u can test it using this in google chrome
    });

10

In jQuery,

if($("#checkboxId").is(':checked')){
    alert("Checked");
}

o

if($("#checkboxId").attr('checked')==true){
    alert("Checked");
}

In JavaScript,

if (document.getElementById("checkboxID").checked){
    alert("Checked");
}

7
Questo non risponde alla domanda.
Samuel Liew

2
Questa risposta non è aggiornata perché utilizza .attrinvece di .prop.
Blazemonger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.