jQuery, caselle di controllo e .is (": verificato")


91

Quando associo una funzione a un elemento della casella di controllo come:

$("#myCheckbox").click( function() {
    alert($(this).is(":checked"));
});

La casella di controllo cambia il suo attributo selezionato prima che l'evento venga attivato, questo è il comportamento normale e fornisce un risultato inverso.

Tuttavia, quando lo faccio:

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

La casella di controllo cambia l'attributo selezionato dopo che l'evento è stato attivato.

La mia domanda è: esiste un modo per attivare l'evento clic da jQuery come farebbe un normale clic (primo scenario)?

PS: ho già provato con trigger('click');


5
L'ho appena verificato. Hai completamente ragione. Ciò sembra come potrebbe essere un bug. Mi piacerebbe alzo come un bug con jQuery e vedere cosa succede dev.jquery.com
Cletus

1
E l'evento "cambiamento"?
ZippyV

@cletus In effetti, è un bug di Jquery 1.4.2. 1.3.2 funziona perfettamente.
Ben

Vedo lo stesso comportamento sia in 1.4.2 che in 1.3.2: jsfiddle.net/HCUNn
Nick Craver

@ Nick Fa ancora l'opposto di quello che farebbe un normale clic del mouse. Onestamente non so perché 1.3.2 funziona per me e 1.4.2 no, ma ancora, deve essere cambiato.
Ben

Risposte:


101
$('#myCheckbox').change(function () {
    if ($(this).prop("checked")) {
        // checked
        return;
    }
    // not checked
});

Nota: nelle versioni precedenti di jquery era OK usare attr. Ora si consiglia di utilizzareprop per leggere lo stato.


1
Ho provato, "$ (# myCheckbox) .click ()" deseleziona / seleziona la casella ma la funzione di modifica non viene mai attivata. Ho anche provato a modificare l'attributo "verificato" invece di chiamare click () e persino impostare la funzione "modifica" su "live".
Ben

@ Ben - Devi attivarlo in un modo diverso per farlo funzionare, vedi la mia risposta per l'istruzione trigger.
Nick Craver

@Nick Grazie, accetterò la risposta di tcurdt poiché è stato il primo a presentare la soluzione. Sciocco io non ho attivato il metodo di "modifica".
Ben

19
e per le versioni più recenti di jquery la funzione è prop ("verificata") invece di attr ("verificata") nel caso in cui catturi qualcun altro.
danski

Eviterei 'prop' a causa della non compatibilità con le versioni precedenti, esp. in IE.
vapcguy

27

C'è una soluzione che funziona in jQuery 1.3.2 e 1.4.2 :

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');​​​​​​​​​​​​​

Ma sono d'accordo, questo comportamento sembra bacato rispetto all'evento nativo.


10

A giugno 2016 (utilizzando jquery 2.1.4) nessuna delle altre soluzioni suggerite funziona. Il controllo attr('checked')restituisce sempre undefinede is('checked)restituisce sempre false.

Usa semplicemente il metodo prop:

$("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

2
is('checked)restituirà false perché "controllato" non è uno pseudo selettore CSS. Quello corretto dovrebbe essere in is(':checked')modo che cerchi invece ": verificato".
dhaupin

4

Sto ancora riscontrando questo comportamento con jQuery 1.7.2. Una soluzione semplice consiste nel posticipare l'esecuzione del gestore dei clic con setTimeout e lasciare che il browser faccia la sua magia nel frattempo:

$("#myCheckbox").click( function() {
    var that = this;
    setTimeout(function(){
        alert($(that).is(":checked"));
    });
});

Sì! Un po 'fuori tema, ma dovevo fare lo stesso nelle griglie Kendo con le caselle di controllo quando qualcuno faceva clic su "Aggiungi nuovo record" se volevo che fosse "Attivo" per impostazione predefinita. Ho dovuto anche dargli un tempo di 500 ms. Poi ho dovuto aggiungere .click(), quindi impostare .attr('value', 'true'), quindi .change(), quindi .blur()prima che fosse a livello di codice impostare la casella quando ho cliccato il pulsante "Aggiorna" a livello di codice ....
vapcguy

2

Se prevedi questo comportamento piuttosto indesiderato, allora potresti passare un parametro extra da jQuery.trigger () al gestore dei clic della casella di controllo. Questo parametro aggiuntivo serve a notificare al gestore dei clic che il clic è stato attivato a livello di programmazione, anziché da parte dell'utente che fa clic direttamente sulla casella di controllo stessa. Il gestore dei clic della casella di controllo può quindi invertire lo stato del controllo segnalato.

Quindi ecco come attivare l'evento clic su una casella di controllo con l'ID "myCheckBox". Nota che sto anche passando un parametro oggetto con un singolo membro, nonUI, che è impostato su true:

$("#myCheckbox").trigger('click', {nonUI : true})

Ed ecco come lo gestisco nel gestore dell'evento clic della casella di controllo. La funzione del gestore verifica la presenza dell'oggetto nonUI come secondo parametro. (Il primo parametro è sempre l'evento stesso.) Se il parametro è presente e impostato a true, inverto lo stato segnalato .checked. Se non viene passato alcun parametro di questo tipo, cosa che non ci sarà se l'utente ha semplicemente fatto clic sulla casella di controllo nell'interfaccia utente, riporto lo stato .checked effettivo:

$("#myCheckbox").click(function(e, parameters) {
   var nonUI = false;
        try {
            nonUI = parameters.nonUI;
        } catch (e) {}
        var checked = nonUI ? !this.checked : this.checked;
        alert('Checked = ' + checked);
    });

Versione JSFiddle su http://jsfiddle.net/BrownieBoy/h5mDZ/

Ho provato con Chrome, Firefox e IE 8.


2
<input id="widget-wpb_widget-3-custom_date" class="mycheck" type="checkbox" value="d/M/y" name="widget-wpb_widget[3][custom_date]" unchecked="true">    

var atrib = $('.mycheck').attr("unchecked",true);
$('.mycheck').click(function(){
if ($(this).is(":checked")) 
{
$('.mycheck').attr("unchecked",false);
   alert("checkbox checked");
}
else
{
$('.mycheck').attr("unchecked",true);
 alert("checkbox unchecked");
}
});

Alcuni commenti sarebbero carini
Danil Gaponov

1
  $("#checkbox").change(function(e) {

  if ($(this).prop('checked')){
    console.log('checked');
  }
});

1
$("#personal").click(function() {
      if ($(this).is(":checked")) {
            alert('Personal');
        /* var validator = $("#register_france").validate(); 
        validator.resetForm(); */
      }
            }
            );

JSFIDDLE


0

Bene, per abbinare il primo scenario, questo è qualcosa che ho escogitato.

http://jsbin.com/uwupa/edit

In sostanza, invece di associare l'evento "clic", associ l'evento "modifica" all'avviso.

Quindi, quando si attiva l'evento, prima si attiva il clic, quindi si attiva la modifica.


0

Oltre alla risposta di Nick Craver, affinché funzioni correttamente IE 8è necessario aggiungere un gestore di clic aggiuntivo alla casella di controllo:

// needed for IE 8 compatibility
if ($.browser.msie)
    $("#myCheckbox").click(function() { $(this).trigger('change'); });

$("#myCheckbox").change( function() {
    alert($(this).is(":checked"));
});

//Trigger by:
$("#myCheckbox").trigger('click').trigger('change');

Altrimenti la richiamata verrà attivata solo quando la casella di controllo perde il focus, poiché IE 8mantiene il focus sulle caselle di controllo e sulle radio quando vengono cliccate.

Non ho provato IE 9però.


0
$( "#checkbox" ).change(function() {
    if($(this).is(":checked")){
        alert('hi');
    }

});

1
Si prega di menzionare alcuni dettagli
CodeWarrior

Sembra che questa sia solo una risposta ripetuta, che usa changeinvece degli OP click, e usa solo ifun'affermazione come un modo diverso di testare :checked.
vapcguy

-1

Il modo più semplice e veloce :

$('#myCheckbox').change(function(){
    alert(this.checked);
});

$el[0].checked;

$ el - è l'elemento jquery di selezione.

Godere!


-2
if ($.browser.msie) {
    $("#myCheckbox").click(function() { $(this).trigger('change'); });
}

$("#myCheckbox").change(function() {
        alert($(this).is(":checked"));
    });
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.