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?

Profesor Chaos
sumber
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'));        
    });
});
kasdega
sumber
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");
    }
});
Joseph Marikle
sumber
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
lko
sumber
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

zarun
sumber
11

Bagi saya ini sangat bagus:

$('#checkboxID').click(function () {
    if ($(this).attr('checked')) {
        alert('is checked');
    } else {
        alert('is not checked');
    }
})
chris
sumber
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>
Pengembang
sumber
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.

yoozer8
sumber
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/

Tuan
sumber
6

jika Anda menggunakan iCheck Jquery gunakan kode di bawah ini

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

Coba ini

$('#checkbox1').click(function() {
        if (!this.checked) {
            var sure = confirm("Are you sure?");
            this.checked = sure;
            $('#textbox1').val(sure.toString());
        }
    });
ShankarSangoli
sumber
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'));
            }
        }
    });
});
Jason
sumber
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;
    });
});
Marcelo De Zen
sumber
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>
pengguna3636759
sumber
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>

HUBUNGI19
sumber
1

cukup gunakan klik event id kotak centang saya adalah CheckAll

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

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

             alert(";)");
      }
    }
Geeti
sumber
1

dapatkan nilai radio berdasarkan nama

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

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

if(!$(this).is(":checked")){ console.log("on"); }
CharlotteOswald
sumber
-1
 $("#person_IsCurrentAddressSame").change(function ()
    {
        debugger
        if ($("#person_IsCurrentAddressSame").checked) {
            debugger

        }
        else {

        }

    })
Hari Lakkakula
sumber
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