Modifica della casella di controllo jQuery e evento clic


564

$(document).ready(function() {
  //set initial state.
  $('#textbox1').val($(this).is(':checked'));

  $('#checkbox1').change(function() {
    $('#textbox1').val($(this).is(':checked'));
  });

  $('#checkbox1').click(function() {
    if (!$(this).is(':checked')) {
      return confirm("Are you sure?");
    }
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" id="checkbox1"/><br />
<input type="text" id="textbox1"/>

Qui .change()aggiorna il valore della casella di testo con lo stato della casella di controllo. Uso .click()per confermare l'azione deselezionando. Se l'utente seleziona Annulla, il segno di spunta viene ripristinato ma si .change()attiva prima della conferma.

Questo lascia le cose in uno stato incoerente e la casella di testo dice false quando la casella è selezionata.

Come posso gestire la cancellazione e mantenere il valore della casella di testo coerente con lo stato di controllo?


1
Funziona in FF e Chrome e ha il comportamento spiegato in IE 8. Quindi potrebbe essere importante notare in quali browser hai bisogno per farlo funzionare e in quali stai vedendo l'errore.
Kasdega,

Non è il migliore, ma credo che funzioni per me qui: http://jsfiddle.net/Skooljester/2Xxcn/ .
Ayyp

Risposte:


904

Testato su JSFiddle e fa quello che stai chiedendo. Questo approccio ha l'ulteriore vantaggio di sparare quando si fa clic su un'etichetta associata a una casella di controllo.

Risposta aggiornata:

$(document).ready(function() {
    //set initial state.
    $('#textbox1').val(this.checked);

    $('#checkbox1').change(function() {
        if(this.checked) {
            var returnVal = confirm("Are you sure?");
            $(this).prop("checked", returnVal);
        }
        $('#textbox1').val(this.checked);        
    });
});

Risposta originale:

$(document).ready(function() {
    //set initial state.
    $('#textbox1').val($(this).is(':checked'));

    $('#checkbox1').change(function() {
        if($(this).is(":checked")) {
            var returnVal = confirm("Are you sure?");
            $(this).attr("checked", returnVal);
        }
        $('#textbox1').val($(this).is(':checked'));        
    });
});

128
Solo una nota, è molto più veloce da usare this.checkedinvece di $(this).is(':checked'): jsperf.com/prop-vs-ischecked/5
Dakota

37
@Dakota Concesso, è molto più lento, ma stiamo ancora parlando di 600k operazioni / sec. Quindi, 600 volte al millisecondo. Penso che se questo inizia a causare problemi di prestazioni sulla tua pagina web, potresti dover rivalutare il tuo javascript;) Tuttavia, è bene comprendere le metriche delle prestazioni con il codice. Grazie.
Mike U

51
@MikeU: sono d'accordo con te sull'ottimizzazione prematura, ma considerando che this.checkedè molto più breve scrivere + javascript nativo, potrebbe valere la pena usarlo in generale (oltre a essere ~ 200 a 300 volte più veloce).
Levite,

11
Consiglierei .prop () invece di .attr () poiché quest'ultimo non funziona in tutti i casi e credo che jQuery consiglia ora .prop () ora.
kabadisha,

2
Penso che [questo] in $ ('# textbox1'). Val (this.checked); si riferisce al documento. Dovrebbe essere $ ('# textbox1'). Val ($ ('# checkbox1'). Is (': controllato'));
yurin,

90

dimostrazione

Uso mousedown

$('#checkbox1').mousedown(function() {
    if (!$(this).is(':checked')) {
        this.checked = confirm("Are you sure?");
        $(this).trigger("change");
    }
});

Visualizza l'avviso quando lo controlla e mi impedisce sempre di verificare in effetti. Questo è su Chrome.
pimvdb,

come @pimvdm. La conferma appare anche per il check-action (dovrebbe apparire solo per deselezionare) e selezionando ok non si ottiene la spunta sulla casella.
Professor Chaos,

1
Funziona quando si utilizza il mouse, ma non se lo si sta controllando con la tastiera.
frinux il

3
@frinux Questo è semplicemente perché è una domanda relativa al mouse. Si prega di non sottovalutare le risposte in base alla loro rilevanza per problemi completamente separati. Se riscontri problemi nell'attivare lo stato di un indicatore dopo un checkbox tramite tastiera, ti preghiamo di inviare una domanda al riguardo invece di sottovalutare le risposte con noncuranza.
Joseph Marikle,

3
Downvoted poiché mousedown non è l'unico modo in cui un utente può interagire con la casella di controllo.
Jonathan,

51

La maggior parte delle risposte non la prenderanno (presumibilmente) se si utilizza <label for="cbId">cb name</label>. Ciò significa che quando si fa clic sull'etichetta verrà selezionata la casella anziché fare clic direttamente sulla casella di controllo. (Non esattamente la domanda, ma vari risultati di ricerca tendono a venire qui)

<div id="OuterDivOrBody">
    <input type="checkbox" id="checkbox1" />
    <label for="checkbox1">Checkbox label</label>
    <br />
    <br />
    The confirm result:
    <input type="text" id="textbox1" />
</div>

In tal caso è possibile utilizzare:

Earlier versions of jQuery:

$('#OuterDivOrBody').delegate('#checkbox1', 'change', function () {
    // From the other examples
    if (!this.checked) {
        var sure = confirm("Are you sure?");
        this.checked = !sure;
        $('#textbox1').val(sure.toString());
    }
});

Esempio JSFiddle con jQuery 1.6.4

jQuery 1.7+

$('#checkbox1').on('change', function() { 
    // From the other examples
    if (!this.checked) {
        var sure = confirm("Are you sure?");
        this.checked = !sure;
        $('#textbox1').val(sure.toString());
    }
});

Esempio JSFiddle con l'ultimo jQuery 2.x

  • Aggiunti esempi jsfiddle e html con l'etichetta della casella cliccabile

1
È #OuterDivOrBody no .OuterDivOrBody :)
Laurent Brieu

24

Bene ... solo per salvare un mal di testa (qui è passata la mezzanotte), potrei venire con:

$('#checkbox1').click(function() {
  if (!$(this).is(':checked')) {
    var ans = confirm("Are you sure?");
     $('#textbox1').val(ans);
  }
});

Spero che sia d'aiuto


11

Per me funziona alla grande:

$('#checkboxID').click(function () {
    if ($(this).attr('checked')) {
        alert('is checked');
    } else {
        alert('is not checked');
    }
})

4
È arrivato attraverso una ricerca web. Dovresti usare 'prop' invece di 'attr' >> api.jquery.com/prop
Dr Schizo

11

Ecco qui

html

<input id="ProductId_a183060c-1030-4037-ae57-0015be92da0e" type="checkbox" value="true">

JavaScript

<script>
    $(document).ready(function () {

      $('input[id^="ProductId_"]').click(function () {

        if ($(this).prop('checked')) {
           // do what you need here     
           alert("Checked");
        }
        else {
           // do what you need here         
           alert("Unchecked");
        }
      });

  });
</script>

6

Sbarazzati dell'evento change e modifica invece il valore della casella di testo nell'evento click. Invece di restituire il risultato della conferma, prenderlo in una var. Se è vero, cambia il valore. Quindi restituire il var.


6

Fare clic sulla casella di controllo e verificare il valore nello stesso loop di eventi è il problema.

Prova questo:

$('#checkbox1').click(function() {
    var self = this;
    setTimeout(function() {

        if (!self.checked) {
            var ans = confirm("Are you sure?");
            self.checked = ans;
            $('#textbox1').val(ans.toString());
        }
    }, 0);
});

Demo: http://jsfiddle.net/mrchief/JsUWv/6/


6

se stai usando iCheck Jquery usa il codice qui sotto

 $("#CheckBoxId").on('ifChanged', function () {
                alert($(this).val());
            });

5

Prova questo

$('#checkbox1').click(function() {
        if (!this.checked) {
            var sure = confirm("Are you sure?");
            this.checked = sure;
            $('#textbox1').val(sure.toString());
        }
    });

5
$(document).ready(function() {
    //set initial state.
    $('#textbox1').val($(this).is(':checked'));

    $('#checkbox1').change(function() {
        $('#textbox1').val($(this).is(':checked'));
    });

    $('#checkbox1').click(function() {
        if (!$(this).is(':checked')) {
            if(!confirm("Are you sure?"))
            {
                $("#checkbox1").prop("checked", true);
                $('#textbox1').val($(this).is(':checked'));
            }
        }
    });
});

4
// this works on all browsers.

$(document).ready(function() {
    //set initial state.
    $('#textbox1').val($(this).is(':checked'));

    $('#checkbox1').change(function(e) {
        this.checked =  $(this).is(":checked") && !!confirm("Are you sure?");
        $('#textbox1').val(this.checked);
        return true;
    });
});

4
$('#checkbox1').click(function() {
    if($(this).is(":checked")) {
        var returnVal = confirm("Are you sure?");
        $(this).attr("checked", returnVal);
    }
    $('#textbox1').val($(this).is(':checked')); 
});


<div id="check">
    <input type="checkbox" id="checkbox1" />
    <input type="text" id="textbox1" />
</div>

4

Risposta in ritardo, ma puoi anche usare on("change")

$('#check').on('change', function() {
     var checked = this.checked
    $('span').html(checked.toString())
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="checkbox" id="check" > <span>Check me!</span>


1

basta semplicemente usare l'evento click la mia casella di controllo è CheckAll

     $('#CheckAll').click(function () {

        if ($('#CheckAll').is(':checked') == true) {

             alert(";)");
      }
    }

1

ottenere il valore radio per nome

 $('input').on('className', function(event){
        console.log($(this).attr('name'));
        if($(this).attr('name') == "worker")
            {
                resetAll();                 
            }
    });

1

Non sono sicuro del motivo per cui tutti lo stanno rendendo così complicato. Questo è tutto ciò che ho fatto.

if(!$(this).is(":checked")){ console.log("on"); }

-1
 $("#person_IsCurrentAddressSame").change(function ()
    {
        debugger
        if ($("#person_IsCurrentAddressSame").checked) {
            debugger

        }
        else {

        }

    })

3
Le risposte di solo codice sono considerate di bassa qualità: assicurati di fornire una spiegazione su cosa fa il tuo codice e su come risolve il problema. Aiuterà il richiedente e i futuri lettori sia se è possibile aggiungere ulteriori informazioni nel tuo post. Vedi anche Spiegare le risposte interamente basate su codice: meta.stackexchange.com/questions/114762/…
borchvm
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.