Saya mencari solusi umum untuk ini.
Pertimbangkan 2 input jenis radio dengan nama yang sama. Saat dikirimkan, yang diperiksa menentukan nilai yang dikirim dengan formulir:
<input type="radio" name="myRadios" onchange="handleChange1();" value="1" />
<input type="radio" name="myRadios" onchange="handleChange2();" value="2" />
Acara perubahan tidak menyala ketika tombol radio tidak dipilih. Jadi jika radio dengan nilai = "1" sudah dipilih dan pengguna memilih yang kedua, handleChange1 () tidak berjalan. Ini menghadirkan masalah (bagi saya toh) karena tidak ada peristiwa di mana saya dapat menangkap seleksi-de ini.
Apa yang saya inginkan adalah solusi untuk acara onchange untuk nilai grup kotak centang atau sebagai alternatif aktivitas oncheck yang mendeteksi tidak hanya ketika radio dicentang tetapi juga saat tidak dicentang.
Saya yakin beberapa dari Anda pernah mengalami masalah ini sebelumnya. Apa saja pemecahan masalah (atau idealnya apa cara yang tepat untuk menangani ini)? Saya hanya ingin menangkap perubahan acara, mengakses radio yang sebelumnya diperiksa serta radio yang baru diperiksa.
PS
onclick sepertinya acara (lintas-peramban) yang lebih baik untuk menunjukkan kapan radio diperiksa tetapi masih tidak menyelesaikan masalah yang tidak dicentang.
Saya kira masuk akal mengapa pertukaran untuk jenis kotak centang tidak berfungsi dalam kasus seperti ini karena ini mengubah nilai yang dikirimkan ketika Anda memeriksa atau tidak mencentangnya. Saya berharap tombol radio berperilaku lebih seperti pertukaran elemen SELECT tetapi apa yang dapat Anda lakukan ...
sumber
myRadios
untuk membaca variabelprev
yang memegang radio yang saat ini dipilih. Perbandingan dilakukan di dalam setiap penangan klik untuk memutuskan apakah radio yang diklik sama dengan yang disimpanprev
dan jika tidak, radio yang saat ini diklik disimpan di sana. Di dalam pengendali klik, Anda memiliki akses keprev
radio yang sebelumnya dipilih: dan radio yang saat ini dipilih:this
rad[i].addEventListener('change', function(){ //your handler code })
dan itu akan bekerja untuk mouse dan keyboardSaya akan membuat dua perubahan:
onclick
handler alih-alihonchange
- Anda mengubah "status dicentang" dari input radio, bukanvalue
, jadi tidak ada perubahan yang terjadi.this
sebagai parameter, yang akan memudahkan untuk memeriksa nilai mana yang saat ini dipilih.ETA: Seiring dengan
handleClick()
fungsi Anda, Anda dapat melacak nilai asli / lama radio dalam variabel cakupan halaman. Itu adalah:sumber
onclick
Pawang hanya bernama buruk - menangani acara pemilihan tombol radio apakah tombol diklik, disentuh, atau diaktifkan dengan menekan "enter" pada keyboard. Theonchange
handler tidak yang sesuai dalam kasus ini karena nilai input tidak berubah, hanya diperiksa / atribut dicentang. Saya telah menambahkan contoh skrip untuk mengatasi nilai sebelumnya.Seperti yang Anda lihat dari contoh ini: http://jsfiddle.net/UTwGS/
HTML:
jQuery:
baik acara
click
danchange
dipecat ketika memilih opsi tombol radio (setidaknya di beberapa browser).Saya juga harus menunjukkan bahwa dalam contoh saya
click
acara masih dipecat ketika Anda menggunakan tab dan keyboard untuk memilih opsi.Jadi, maksud saya adalah bahwa meskipun
change
acara dipecat adalah beberapa browser,click
acara tersebut harus menyediakan cakupan yang Anda butuhkan.sumber
console.log
pernyataan dalam kode saya, yang tidak didukung IE7. Anda bisa memberitahukannya di IE jika Anda mau.click
danchange
, Anda akhirnya akan memanggil penangan dua kali. Dalam hal ini, karena @Matthew berkaitan dengan nilai sebelumnya, yang dapat menyebabkan konsekuensi buruk.click
adalah penangan yang benar di sini dan satu-satunya yang Anda butuhkan. Revisi Anda mengklarifikasi itu, jadi saya menghapus suara pilihan saya.Bagaimana dengan menggunakan acara perubahan Jquery?
jsfiddle: http://jsfiddle.net/f8233x20/
sumber
$(this).val()
juga bisa diganti dengan javascript aslie.currentTarget.value
, di mana e adalah objek acara yang melewati fungsi panggilan balik.Seperti yang Anda lihat di sini: http://www.w3schools.com/jsref/event_onchange.asp Atribut onchange tidak didukung untuk tombol radio.
Pertanyaan SO pertama yang ditautkan oleh Anda memberi Anda jawabannya: Gunakan
onclick
acara itu dan periksa status tombol radio di dalam fungsi yang dipicunya.sumber
onclick
bukan semantik yang sama, karena Anda dapat mengubah ketelitian tombol radio melalui input keyboard mengingat pemilihan bentuk keyboard diaktifkan.Saya tidak berpikir ada cara lain selain menyimpan keadaan sebelumnya. Ini solusinya dengan jQuery
Setelah memikirkannya sedikit lebih banyak, saya memutuskan untuk menyingkirkan variabel dan menambah / menghapus kelas. Inilah yang saya dapatkan: http://jsfiddle.net/BeQh3/2/
sumber
Ya tidak ada perubahan acara untuk tombol radio yang dipilih saat ini. Tetapi masalahnya adalah ketika setiap tombol radio diambil sebagai elemen yang terpisah. Sebagai gantinya grup radio harus dianggap sebagai elemen tunggal
select
. Jadi perubahan acara dipicu untuk grup itu. Jika itu adalahselect
elemen, kami tidak pernah khawatir tentang setiap opsi di dalamnya, tetapi hanya mengambil opsi yang dipilih. Kami menyimpan nilai saat ini dalam variabel yang akan menjadi nilai sebelumnya, ketika opsi baru dipilih. Demikian pula Anda harus menggunakan variabel terpisah untuk menyimpan nilai tombol radio yang diperiksa.Jika Anda ingin mengidentifikasi tombol radio sebelumnya, Anda harus mengulang
mousedown
acara.lihat ini: http://jsfiddle.net/diode/tywx6/2/
sumber
Simpan radio yang diperiksa sebelumnya dalam sebuah variabel:
http://jsfiddle.net/dsbonev/C5S4B/
HTML
JS
KODE CONTOH JS
sumber
Saya menyadari ini adalah masalah lama, tetapi potongan kode ini cocok untuk saya. Mungkin seseorang di masa depan akan merasakan manfaatnya:
sumber
onkeydown="radioChange('juju','button1',radioArray);"
Anda juga bisa menangkap ketika pengguna menggunakan ruang untuk memeriksa radio.Ini tepat di atas kepala saya, tetapi Anda bisa melakukan acara onClick untuk setiap tombol radio, berikan semua ID yang berbeda, dan kemudian buat loop untuk acara tersebut melalui setiap tombol radio dalam grup dan temukan yang mana diperiksa dengan melihat atribut 'diperiksa'. Id dari yang dicentang akan disimpan sebagai variabel, tetapi Anda mungkin ingin menggunakan variabel temp terlebih dahulu untuk memastikan bahwa nilai variabel itu berubah, karena acara klik akan menyala apakah tombol radio baru diperiksa atau tidak.
sumber
sumber
Jika Anda ingin menghindari skrip inline, Anda cukup mendengarkan acara klik di radio. Ini dapat dicapai dengan Javascript biasa dengan mendengarkan acara klik pada
sumber
Anda dapat menambahkan skrip JS berikut
sumber
ini bekerja untuk saya
sumber
Ini adalah fungsi termudah dan paling efisien untuk digunakan, cukup tambahkan tombol sebanyak yang Anda inginkan ke tanda centang = false dan buat acara klik setiap tombol radio untuk memanggil fungsi ini. Tentukan nomor unik untuk setiap tombol radio
sumber
Cara termudah dan penuh daya
hanya baca input radio menggunakan getAttribute
sumber