Apakah mungkin untuk menonaktifkan roda gulir mengubah nomor di kolom nomor masukan? Saya telah mengotak-atik CSS khusus webkit untuk menghapus spinner, tetapi saya ingin menyingkirkan perilaku ini sama sekali. Saya suka menggunakan type=number
karena menampilkan keyboard yang bagus di iOS.
javascript
css
html
forms
kjs3
sumber
sumber
onscroll
penangan dengan hanyaevent.preventDefault()
di dalamnya?Jawaban:
Mencegah perilaku default peristiwa roda mouse pada elemen masukan nomor seperti yang disarankan oleh orang lain (memanggil "blur ()" biasanya bukan cara yang disukai untuk melakukannya, karena bukan itu yang diinginkan pengguna).
TAPI. Saya akan menghindari mendengarkan event roda mouse pada semua elemen input-number sepanjang waktu dan hanya melakukannya, ketika elemen berada dalam fokus (saat itulah masalahnya). Jika tidak , pengguna tidak dapat menggulir halaman saat penunjuk mouse berada di mana saja di atas elemen masukan nomor.
Solusi untuk jQuery:
(Delegasikan acara fokus ke elemen formulir di sekitarnya - untuk menghindari banyak pemroses acara, yang berdampak buruk bagi kinerja.)
sumber
sumber
Satu pendengar acara untuk mengatur semuanya
Hal ini mirip dengan @ Simon Perepelitsa 's jawaban di js murni, tetapi sedikit lebih sederhana, karena menempatkan salah satu pendengar acara pada elemen dokumen dan memeriksa apakah elemen terfokus adalah masukan nomor:
Jika Anda ingin menonaktifkan perilaku pengguliran nilai di beberapa bidang, tetapi tidak yang lain, cukup lakukan ini:
dengan ini:
Jika sebuah input memiliki kelas noscroll, ia tidak akan berubah saat scroll, jika tidak semuanya tetap sama.
Uji di sini dengan JSFiddle
sumber
wheel
alih-alihmousewheel
. Referensi: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event PS. Saya bukan orang yang down vote.http://jsfiddle.net/bQbDm/2/
Untuk contoh jQuery dan solusi lintas-browser, lihat pertanyaan terkait:
Pemroses peristiwa HTML5 untuk scroll input nomor - khusus Chrome
sumber
$(':input[type=number]' ).live('mousewheel',function(e){ $(this).blur(); });
Saya menggunakan blur alih-alih mencegah default sehingga tidak memblokir halaman dari bergulir!live()
sudah usang. Sekarang, Anda harus menggunakanon()
:$(':input[type=number]').on('mousewheel',function(e){ $(this).blur(); });
wheel
alih-alihmousewheel
. Referensi: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventAnda cukup menggunakan atribut onwheel HTML .
Opsi ini tidak berpengaruh pada pengguliran elemen lain dari halaman.
Dan menambahkan pendengar agar semua masukan tidak berfungsi dalam masukan yang dibuat secara dinamis di posterior.
Selain itu, Anda dapat menghapus panah input dengan CSS.
sumber
onBlur()
itu tidak seperti yang diharapkan. Saya menyiapkan cara sederhanareturn false
untuk benar-benar "tidak melakukan apa pun di atas roda".<input type="number" onwheel="return false;">
@Pramuka_semarang
Ada solusi yang lebih baik untuk ini. Blur menghilangkan fokus dari input dan itu adalah efek samping yang tidak Anda inginkan. Anda harus menggunakan evt.preventDefault sebagai gantinya. Ini mencegah perilaku default input saat pengguna menggulir. Ini kodenya:
sumber
wheel
alih-alihmousewheel
. Referensi: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventPertama, Anda harus menghentikan acara roda mouse dengan:
mousewheel.disableScroll
e.preventDefault();
el.blur();
Dua pendekatan pertama menghentikan jendela dari bergulir dan yang terakhir menghapus fokus dari elemen; keduanya merupakan hasil yang tidak diinginkan.
Salah satu solusinya adalah dengan menggunakan
el.blur()
dan memfokuskan kembali elemen setelah penundaan:sumber
var hadFocus = el.is(':focus');
sebelum kabur, dan kemudian penjaga untuk hanya mengatur batas waktu jika hadFocs benar.Jawaban yang diberikan tidak berfungsi di Firefox (Quantum). Pemroses acara perlu diubah dari roda mouse ke roda:
Kode ini berfungsi di Firefox Quantum dan Chrome.
sumber
Untuk siapa saja yang bekerja dengan React dan mencari solusi. Saya telah menemukan bahwa cara termudah adalah dengan menggunakan prop onWheelCapture dalam komponen Input seperti ini:
onWheelCapture={e => { e.target.blur() }}
sumber
Variasi Ketikan
Skrip ketikan perlu tahu bahwa Anda sedang mengerjakan HTMLElement untuk keamanan tipe, jika tidak, Anda akan melihat banyak
Property 'type' does not exist on type 'Element'
tipe kesalahan.sumber
Ketika mencoba menyelesaikan ini untuk diri saya sendiri, saya perhatikan bahwa sebenarnya mungkin untuk mempertahankan pengguliran halaman dan fokus input sambil menonaktifkan perubahan nomor dengan mencoba mengaktifkan kembali peristiwa yang tertangkap pada elemen induk dari yang
<input type="number"/>
mana itu ditangkap. , seperti ini:Namun, ini menyebabkan kesalahan di konsol browser, dan mungkin tidak dijamin bekerja di mana-mana (saya hanya menguji di Firefox), karena ini adalah kode yang sengaja tidak valid.
Solusi lain yang berfungsi dengan baik setidaknya di Firefox dan Chromium adalah membuat
<input>
elemen sementarareadOnly
, seperti ini:Satu efek samping yang saya perhatikan adalah hal itu dapat menyebabkan bidang berkedip selama sepersekian detik jika Anda memiliki gaya berbeda untuk
readOnly
bidang, tetapi setidaknya untuk kasus saya, ini tampaknya tidak menjadi masalah.Demikian pula, (seperti yang dijelaskan dalam jawaban James) alih-alih memodifikasi
readOnly
properti, Anda dapatblur()
bidang dan kemudianfocus()
mengembalikannya, tetapi sekali lagi, bergantung pada gaya yang digunakan, beberapa kedipan mungkin terjadi.Atau, seperti yang disebutkan dalam komentar lain di sini, Anda dapat memanggil
preventDefault()
acara tersebut sebagai gantinya. Dengan asumsi bahwa Anda hanya menanganiwheel
kejadian pada masukan angka yang berada dalam fokus dan di bawah kursor mouse (itulah yang ditunjukkan oleh tiga kondisi di atas), dampak negatif pada pengalaman pengguna hampir tidak ada.sumber
Jika Anda menginginkan solusi yang tidak memerlukan JavaScript, menggabungkan beberapa fungsionalitas HTML dengan pseudo-element CSS akan membantu:
Ini berfungsi karena mengklik konten
<label>
yang terkait dengan bidang formulir akan memfokuskan bidang tersebut. Namun, "kaca jendela" dari elemen semu di atas bidang akan memblokir peristiwa roda mouse agar tidak mencapainya.Kekurangannya adalah tombol pemintal atas / bawah tidak lagi berfungsi, tetapi Anda mengatakan telah menghapusnya.
Secara teori, seseorang dapat memulihkan menu konteks tanpa memerlukan input untuk difokuskan terlebih dahulu:
:hover
gaya tidak boleh diaktifkan saat pengguna menggulir, karena browser menghindari penghitungan ulang selama pengguliran untuk alasan kinerja, tetapi saya belum sepenuhnya lintas-browser / perangkat mengujinya.sumber
sumber
Solusi termudah adalah menambahkan
onWheel={ event => event.currentTarget.blur() }}
input itu sendiri.sumber