Controlla se la casella di controllo NON è selezionata al clic - jQuery


86

Voglio controllare se una casella di controllo è appena stata deselezionata, quando un utente fa clic su di essa. Il motivo è perché desidero eseguire una convalida quando un utente deseleziona una casella di controllo. Perché almeno una casella di controllo deve essere selezionata. Quindi, se deseleziona l'ultimo, si ricontrolla automaticamente.

Con jQuery posso facilmente scoprire se è controllato o meno:

$('#check1').click(function() {
    if($(this).is(':checked'))
        alert('checked');
    else
        alert('unchecked');
});

Ma in realtà voglio solo avere un'istruzione if che controlla se una casella di controllo è appena stata deselezionata.

Quindi ho pensato di poterlo fare con il seguente codice:

$('#check2').click(function() {
    if($(this).not(':checked'))
        alert('unchecked');
    else
        alert('checked');
});

Ma questo mostrerà sempre il messaggio "deselezionato". Non proprio quello che mi aspettavo ...

demo: http://jsfiddle.net/tVM5H/

Quindi alla fine ho bisogno di qualcosa come:

$('#check2').click(function() {
    if($(this).not(':checked')) {
        // Got unchecked, so something!!!
    }
});

Ma ovviamente questo non funziona. Preferisco non usare il primo esempio, perché poi avrei un'istruzione "else" non necessaria quando ho bisogno solo di un'istruzione "if".

Quindi, per prima cosa, è un bug di jQuery? Perché per me è un comportamento inaspettato. E secondo, qualcuno ha idea di una buona alternativa?

Risposte:



50

La risposta già pubblicata funzionerà. Se vuoi usare jQuery: not puoi farlo:

if ($(this).is(':not(:checked)'))

o

if ($(this).attr('checked') == false)

Il primo esempio in questa risposta sembra il più facile da leggere tra tutte le opzioni, quindi voto per quello.
Toby 1 Kenobi

5

jQuery per verificare controllato? Veramente?

if(!this.checked) {

Non usare un bazooka per fare il lavoro di un rasoio.


4
Se si utilizza jQuery per trovare l'elemento, dovrebbe essere visualizzato$(this)[0].checked
Chris

@HoldOffHunger Fa parte dell'elemento di input nativo: developer.mozilla.org/en-US/docs/Web/HTML/Element/input/… Se stai usando jQuery, Chris ha la sintassi corretta nel commento sopra il tuo.
TheZ

@TheZ: Nice! Sì, hai ragione, la risposta di Chris è buona. Suggerimento: aggiungerlo per rispondere con credito? Entrambe le risposte OP e top si orientano verso $ (selector) .is ('...'), che è una pura soluzione jQuery. Usare solo .checkeddove hanno .is('checked')non funzionerà da solo.
HoldOffHunger

5
$(document).ready(function() {
        $("#check1").click(function() {
            var checked = $(this).is(':checked');
            if (checked) {
                alert('checked');
            } else {
                alert('unchecked');
            }
        });
    });


2

Dai un'occhiata ad alcune delle risposte a questa domanda - penso che potrebbe applicarsi alla tua:

come eseguire la funzione clic dopo il comportamento predefinito di un elemento

Penso che tu stia riscontrando un'incongruenza nell'implementazione della onclickfunzione nel browser . Alcuni scelgono di attivare o disattivare la casella di controllo prima che l'evento venga attivato e altri dopo.


Anche questo è davvero molto importante.
TheZ

Ed è per questo che jQuery per verificare la presenza di verificati. Veramente. ;)
JoeBrockhaus

1

La risposta è già stata pubblicata. Ma possiamo usare il jquery anche in questo modo

demo

$(function(){
    $('#check1').click(function() {
        if($('#check1').attr('checked'))
            alert('checked');
        else
            alert('unchecked');
    });

    $('#check2').click(function() {
        if(!$('#check2').attr('checked'))
            alert('unchecked');
        else
            alert('checked');
    });
});

0

Fai cosi

if (typeof $(this).attr("checked") == "undefined" )

// To check if checkbox is checked
if( $(this).attr("checked")=="checked")

Potrebbe essere solo this.checked. La prima riga non ha bisogno di typeoflì (non solleverà mai a ReferencError). Dovresti anche usare al prop()posto di attr(), che restituirà un valore booleano, rendendo ridondante anche il secondo.
alex
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.