perubahan kotak centang jQuery dan klik acara


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

Di sini .change()memperbarui nilai kotak teks dengan status kotak centang. Saya gunakan .click()untuk mengonfirmasi tindakan di hapus centang. Jika pengguna memilih membatalkan, tanda centang dikembalikan tetapi .change()menyala sebelum konfirmasi.

Ini meninggalkan hal-hal dalam keadaan tidak konsisten dan kotak teks mengatakan false ketika kotak centang dicentang.

Bagaimana saya bisa berurusan dengan pembatalan dan menjaga nilai kotak teks konsisten dengan kondisi cek?


1
Ia bekerja di FF dan chrome dan memiliki perilaku yang dijelaskan di IE 8. Jadi mungkin penting untuk mencatat browser mana yang Anda butuhkan untuk bekerja dan mana yang Anda lihat kesalahannya.
kasdega

Ini bukan yang terbaik, tapi saya yakin ini bekerja untuk saya di sini: http://jsfiddle.net/Skooljester/2Xxcn/ .
ayyp

Jawaban:


904

Diuji dalam JSFiddle dan lakukan apa yang Anda minta. Pendekatan ini memiliki manfaat tambahan ketika label yang terkait dengan kotak centang diklik.

Jawaban yang Diperbarui:

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

Jawaban asli:

$(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
Sekedar catatan, ini jauh lebih cepat untuk digunakan this.checkeddaripada $(this).is(':checked'): jsperf.com/prop-vs-ischecked/5
Dakota

37
@ Dakota Memang, ini jauh lebih lambat, tapi kami masih berbicara 600k operasi / detik. Jadi, 600 kali per milidetik. Saya pikir jika ini mulai menyebabkan masalah kinerja pada halaman web Anda, Anda mungkin perlu memeriksa ulang javascript Anda;) Namun, ada baiknya untuk memahami metrik kinerja dengan kode. Terima kasih.
Mike U

51
@MikeU: Setuju dengan Anda tentang pengoptimalan prematur, tetapi mengingat itu this.checkedjauh lebih pendek untuk menulis + javascript asli, mungkin sangat layak digunakan secara umum (selain dari ~ 200 hingga 300 kali lebih cepat).
Levite

11
Saya akan merekomendasikan .prop () daripada .attr () karena yang terakhir tidak bekerja dalam semua kasus dan saya percaya bahwa jQuery merekomendasikan .prop () sekarang.
kabadisha

2
Saya pikir [ini] dalam $ ('# textbox1'). Val (this.checked); mengacu pada dokumen. Seharusnya $ ('# textbox1'). Val ($ ('# checkbox1'). Is (': dicentang'));
yurin

90

Demo

Menggunakan mousedown

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

Ini menampilkan peringatan ketika memeriksanya dan itu selalu mencegah saya memeriksa sebenarnya. Ini di Chrome.
pimvdb

sama dengan @pimvdm. Konfirmasi muncul bahkan untuk tindakan cek (itu hanya akan muncul untuk menghapus centang) dan memilih ok tidak menghasilkan centang pada kotak.
Profesor Chaos

1
Ini bekerja saat menggunakan mouse, tetapi tidak jika Anda memeriksanya dengan keyboard.
frinux

3
@ frinux Itu cukup sederhana karena ini adalah pertanyaan terkait mouse. Tolong jangan downvote jawaban berdasarkan relevansinya dengan masalah yang sepenuhnya terpisah. Jika Anda memiliki masalah memicu keadaan indikator setelah centang kotak centang melalui keyboard, silakan posting pertanyaan tentang hal itu daripada downvoting jawaban dengan ceroboh.
Joseph Marikle

3
Turun karena mousedown bukan satu-satunya cara pengguna dapat berinteraksi dengan kotak centang.
Jonathan

51

Sebagian besar jawaban tidak akan menangkapnya (mungkin) jika Anda gunakan <label for="cbId">cb name</label>. Ini berarti ketika Anda mengklik label itu akan menandai kotak daripada mengklik langsung pada kotak centang. (Tidak persis pertanyaan, tetapi berbagai hasil pencarian cenderung datang ke sini)

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

Dalam hal ini Anda dapat menggunakan:

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

Contoh JSFiddle dengan 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());
    }
});

Contoh JSFiddle dengan jQuery 2.x terbaru

  • Menambahkan contoh jsfiddle dan html dengan label kotak centang yang dapat diklik

1
Ini #OuterDivOrBody tidak .OuterDivOrBody :)
Laurent Brieu

24

Yah .. hanya demi menyelamatkan sakit kepala (sudah lewat tengah malam di sini), saya bisa datang dengan:

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

Semoga ini bisa membantu


11

Bagi saya ini sangat bagus:

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

4
Datangi ini melalui pencarian web. Anda harus menggunakan 'prop' alih-alih 'attr' >> api.jquery.com/prop
Dr Schizo

11

Ini dia

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

Singkirkan acara perubahan, dan alih-alih ubah nilai kotak teks di acara klik. Daripada mengembalikan hasil konfirmasi, tangkap dalam var. Jika benar, ubah nilainya. Lalu kembalikan var.


6

Klik kotak centang dan memeriksa nilai dalam loop peristiwa yang sama adalah masalahnya.

Coba ini:

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

jika Anda menggunakan iCheck Jquery gunakan kode di bawah ini

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

5

Coba ini

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

Jawaban terlambat, tetapi Anda juga dapat menggunakan 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

cukup gunakan klik event id kotak centang saya adalah CheckAll

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

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

             alert(";)");
      }
    }

1

dapatkan nilai radio berdasarkan nama

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

1

Saya tidak yakin mengapa semua orang membuat ini sangat rumit. Ini semua yang saya lakukan.

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

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

        }
        else {

        }

    })

3
Jawaban khusus kode dianggap berkualitas rendah: pastikan untuk memberikan penjelasan apa yang kode Anda lakukan dan bagaimana cara memecahkan masalah. Ini akan membantu penanya dan pembaca di masa mendatang jika Anda dapat menambahkan lebih banyak informasi dalam posting Anda. Lihat juga Menjelaskan sepenuhnya jawaban berbasis kode: meta.stackexchange.com/questions/114762/…
borchvm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.