Dalam contoh berikut, ketika Anda mengklik label, input berubah status.
document.querySelector("label").addEventListener("click", function() {
console.log("clicked label");
});
label {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
<input type="checkbox" id="1">
<label for="1">Label</label>
Di Chrome, ketika Anda memindahkan kursor antara mousedown
dan mouseup
peristiwa input masih akan terpicu, sedangkan di Firefox kotak centang tidak berubah status.
Apakah ada cara untuk memperbaikinya? (tanpa menggunakan pendengar acara JavaScript)
Versi Firefox: 69.0.3 (64-bit)
Set penuh tindakan saat menggunakan chrome.
- Tekan tombol di atas label
- Gerakkan kursor di sekitar (bahkan di luar label) sambil tetap menahan tombol
- Kembalikan kursor ke label
- Lepaskan tombol
javascript
html
css
label
nick zoum
sumber
sumber
1px
akan memecah interaksi.Jawaban:
pengantar
Meskipun saya secara khusus menyatakan dalam pertanyaan bahwa jawabannya tidak boleh melibatkan JavaScript, semua jawaban bekerja dengan JavaScript.
Karena ini tampaknya merupakan bug Firefox dan sebagian besar jawaban yang diajukan pada saat ini akan mengharuskan saya untuk juga mengubah sisa kode saya, saya memutuskan untuk membuat skrip yang dapat dijalankan sekali, akan menangani semua label terlepas dari kapan mereka ditambahkan ke dom dan akan memiliki dampak paling kecil pada skrip saya yang lain.
Solusi - Contoh
Penjelasan
onLabelClick
Fungsi
onLabelClick
perlu dipanggil setiap kali label diklik, itu akan memeriksa apakah label memiliki elemen input yang sesuai. Jika tidak, itu akan memicu itu, menghapusfor
atribut label sehingga browser tidak memiliki bug tidak akan memicu kembali dan kemudian menggunakansetTimeout
dari0ms
untuk menambahkanfor
kembali atribut sekali acara telah menggelegak. Ini berartievent.preventDefault
tidak harus dipanggil dan dengan demikian tidak ada tindakan / acara lain yang akan dibatalkan. Juga jika saya perlu mengesampingkan fungsi ini, saya hanya perlu menambahkan event-listener yang memanggilEvent#preventDefault
atau menghapusfor
atribut.manageLabel
Fungsinya
manageLabel
menerima cek label jika telah ditambahkan pendengar acara untuk menghindari menambahkannya kembali, menambahkan pendengar jika belum ditambahkan, dan menambahkannya ke daftar label telah dikelola.onLoad
Fungsi
onLoad
perlu dipanggil ketika halaman dimuat sehingga fungsimanageLabel
dapat dipanggil untuk semua label pada DOM pada saat itu. Fungsi ini juga menggunakan MutationObserver untuk menangkap label apa pun yang ditambahkan, setelah beban dipecat (dan skrip telah dijalankan).Kode yang ditampilkan di atas dioptimalkan oleh Martin Barker .
sumber
HTMLLabelElement
cek alih-alih HTMLElement dan cek bahwa tagName adalah labelSaya tahu Anda tidak ingin pendengar Acara JS, tetapi saya berpikir Anda bermaksud mengidentifikasi gerakan ini tetapi tidak menggunakan mousedown alih-alih klik (mousedown diikuti oleh mouseup).
Meskipun ini adalah bug yang dikenal di Firefox Anda bisa mengatasinya dengan menggunakan acara mousedown
Saya harus mengubah id Anda menjadi id yang valid harus dimulai dengan karakter
sumber
querySelectorAll
) pada halaman memuat dan kemudian, setiap kali label ditambahkan ke dom. Ini juga dapat mengacaukan pendengar acara mouse yang ditambahkan ke label atau dom secara umum seperti yang Anda gunakanEvent#preventDefault
untuk menghindari mengklik dua kali pada browser yang tidak memiliki bug ini. Akhirnya, menggunakanclick
acara itu akan lebih baik, karena akan memiliki interaksi yang sama dengan tindakan yang dimaksud. Selain itu, ini adalah jawaban terbaik sejauh ini.preventDefault()
masalah Anda , jadi ia bekerja dengan memeriksa apakah browser telah mengubahnya jika tidak mengubahnya, setelah 150 ms cukup cepat bagi pengguna untuk tidak melihatnya, dan cukup lambat bahwa browser akan bertindak Intime jika itu akan melakukan apa yang seharusnya. Apakah itu lebih baik?Tidak. Ini terlihat seperti bug firefox dan bukan masalah dengan kode Anda. Saya tidak percaya ada solusi css untuk perilaku ini.
Anda mungkin dapat melaporkannya ke Mozilla dan memperbaiki masalahnya, tetapi saya tidak akan bergantung pada itu. https://bugzilla.mozilla.org/home
Untuk solusi yang potensial, saya akan menyarankan memicu acara di mouseup sebagai gantinya.
sumber
Tanpa javascript, ketika Anda mengklik label yang memiliki nilai "untuk" sama dengan nilai "id" input, maka input diklik, tetapi ini tidak konsisten di antara browser.
Jika browser mengikuti hal di atas, maka acara klik javascript Anda akan membatalkan efeknya, yang akhirnya tidak melakukan apa-apa.
Sebuah solusi
Untuk memiliki konsistensi di antara peramban, Anda dapat mengadopsi strategi yang berbeda: Membebani secara dinamis mengubah semua atribut 'untuk' untuk 'data-untuk', sehingga membatalkan pengaruh browser asli. Kemudian Anda dapat menerapkan acara klik Anda untuk setiap label.
sumber
document.attachEvent("onreadystatechange",
Saya hanya tidak mengerti kenapa Anda bisa melakukannya dan tidakdocument.addEventListener("DOMContentLoaded",
?Melampirkan acara ke dokumen dan menargetkan elemen yang Anda butuhkan di sana harus menyelesaikan masalah ini.
$ (Dokumen) .on ('klik', '.item', fungsi (acara) {});
Dari membaca topik ini di masa lalu, turun ke Firefox untuk memahami tindakan Anda sebagai upaya untuk menyeret elemen, karena pilih pengguna tidak ada, itu hanya mencegah perilaku default.
Ini didasarkan pada pengetahuan yang cukup terbatas tetapi tampaknya bug / kekhasan yang diketahui dan ada beberapa artikel yang beredar mendukung hal ini.
sumber
without using JavaScript event listeners
.