Saya menggunakan jQuery untuk membuat tombol radio khusus dan saya punya masalah. Saat mengklik label yang terkait dengan radio, peristiwa klik akan menyala dua kali, jika saya hanya mengklik di radio itu sendiri, itu berfungsi dengan baik (sebenarnya bukan radio yang saya klik tetapi div yang membungkus seluruh input dan label). Ini kodenya:
HTML:
<div id="box">
<asp:RadioButtonList ID="RadioButtonList1" runat="server">
<asp:ListItem>RADIO1</asp:ListItem>
<asp:ListItem>RADIO2</asp:ListItem>
<asp:ListItem>RADIO3</asp:ListItem>
</asp:RadioButtonList>
</div>
jQuery:
<script type="text/javascript">
$(function () {
$('#box').find('input:radio').each(function (i) {
var input = $(this);
// get the associated label using the input's id
var label = $('label[for=' + input.attr('id') + ']');
// wrap the input + label in a div
$('<div class="custom-radio"></div>').insertBefore(input).append(label, input);
var wrapperDiv = input.parent();
// find all inputs in this set using the shared name attribute
var allInputs = $('input[name=' + input.attr('name') + ']');
// necessary for browsers that don't support the :hover pseudo class on labels
label.hover(
function () {
$(this).addClass('hover');
}, function () {
$(this).removeClass('hover checkedHover');
});
//bind custom event, trigger it, bind click,focus,blur events
wrapperDiv.bind('updateState', function () {
if ($(this)[0].children[1].checked) {
allInputs.each(function () {
var curDiv = $('div > label[for=' + $(this).attr('id') + ']').parent();
curDiv.removeClass('custom-radio-checked');
curDiv.addClass('custom-radio');
});
$(this).toggleClass('custom-radio custom-radio-checked');
}
else {
$(this).removeClass('custom-radio-checked checkedHover checkedFocus');
}
})
.trigger('updateState')
.click(function () { console.log('click'); })
.focus(function () {
label.addClass('focus');
}).blur(function () {
label.removeClass('focus checkedFocus');
});
});
});
</script>
Apakah ada solusi untuk perilaku ini?
jQuery('input').prop('checked', true);
return false;
setara dengan `evt.stopPropagation (); evt.preventDefault (); ( di jQuery )Saya mencoba menambahkan solusi di atas dengan menambahkan:
tapi tidak berhasil. Namun menambahkan ini:
memecahkan masalah! :)
sumber
evt.stopPropagation(); evt.preventDefault();
tidak; 'tIkat acara klik ke masukan, bukan ke label. Ketika label diklik - peristiwa akan tetap terjadi karena, seperti yang disebutkan Dustin, klik pada label memicu klik pada input. Ini akan memungkinkan label untuk mempertahankan fungsi normalnya.
Dari pada
sumber
change
bahkan pada tombol radio karena teks label dapat diklik - mereka tidak selalu mengeklik tombol radio itu sendiri.label > input
pengaturan Bootstrapesque , ini adalah jawabannya, bukan jawaban. Menambahkanevt.stopPropagation()
atauevt.preventDefault()
ke kode Anda, meskipun efektif, adalah peretasan yang harus dihindari jika solusi yang tepat jauh lebih bersih dan efisien.Jika Anda mencoba menggunakan penampung luar sebagai elemen klik, Anda juga dapat membiarkan peristiwa menggelembung secara alami dan menguji elemen yang diharapkan di penangan klik Anda. Skenario ini berguna jika Anda mencoba memberi gaya zona klik unik untuk formulir.
sumber
if (e.target == e.currentTarget) {}
Untuk memperbaikinya dengan cara mudah, hapus atribut "for" pada label. Klik pada label juga akan memicu klik pada elemen terkait. (yang dalam kasus Anda mengaktifkan peristiwa klik dua kali.)
Semoga berhasil
sumber
Saya biasanya menggunakan synthax ini
dari pada
sumber
Jawaban terbaik tersembunyi di dalam komentar:
Ini biola menggambarkan bahwa semua lainnya solusi -
stopPropagation
,stopImmediatePropagation
,preventDefault
,return false
- baik perubahan apa-apa atau menghancurkan kotak centang / fungsi radio). Ini juga menggambarkan bahwa ini adalah masalah JavaScript vanilla, bukan masalah jQuery.EDIT: Solusi kerja lain yang baru saja saya temukan di utas lain adalah mengikat
onclick
ke input daripada label. Biola diperbarui .sumber
Saya telah mencoba dengan menambahkan solusi.
tapi tidak berhasil.
Dengan menambahkan
memecahkan masalah! :)
sumber
Masalah dengan e.preventDefault (); apakah itu menghentikan klik label dari memeriksa tombol radio.
Solusi yang lebih baik adalah dengan menambahkan pemeriksaan cepat "dicentang" seperti ini:
sumber
Masalah saya sedikit berbeda, karena
evt.stopPropagation();evt.preventDefault();
tidak berhasil untuk saya, saya hanya menambahkanreturn false;
di bagian akhir, lalu berhasil.sumber
Dalam kasus saya, masalahnya adalah saya memiliki acara klik dalam suatu fungsi dan fungsi tersebut dijalankan dua kali .... setiap eksekusi fungsi tersebut membuat acara klik baru. - Telapak tangan -
setelah memindahkan peristiwa klik di luar fungsi, semuanya bekerja seperti yang diharapkan! :)
sumber
Coba letakkan tag masukan Anda di luar elemen pemicu, karena tag label mengemulasi klik, jadi Anda akan selalu memiliki lebih dari satu panggilan.
sumber
Saya memiliki masalah yang sama karena saya telah menempatkan radio saya di dalam label seperti ini dengan penangan yang terpasang ke radio_div. Menghapus label bertingkat memperbaiki masalah.
sumber
Label memicu radio / kotak centang untuk dicentang.
Ini mencegah terutama label untuk memicu perilaku ini.
sumber
Klik pada label dengan atribut for = "some-id" memicu klik baru, tetapi hanya jika target ada dan merupakan masukan. Saya tidak dapat menyelesaikannya dengan sempurna dengan e.preventDefault () atau hal-hal seperti itu jadi saya melakukannya seperti ini:
Misalnya, jika Anda memiliki struktur ini dan menginginkan acara dengan mengklik .some-class
Apa yang berhasil adalah:
sumber