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:
e.target.parentElement.dispatchEvent(e);
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 sementara readOnly, seperti ini:
function handleScroll(e) {
if (e.target.tagName.toLowerCase() === 'input'
&& (e.target.type === 'number')
&& (e.target === document.activeElement)
&& !e.target.readOnly
) {
e.target.readOnly = true;
setTimeout(function(el){ el.readOnly = false; }, 0, e.target);
}
}
document.addEventListener('wheel', function(e){ handleScroll(e); });
Satu efek samping yang saya perhatikan adalah hal itu dapat menyebabkan bidang berkedip selama sepersekian detik jika Anda memiliki gaya berbeda untuk readOnlybidang, tetapi setidaknya untuk kasus saya, ini tampaknya tidak menjadi masalah.
Demikian pula, (seperti yang dijelaskan dalam jawaban James) alih-alih memodifikasi readOnlyproperti, Anda dapat blur()bidang dan kemudian focus()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 menangani wheelkejadian 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.