Kendim için çözmeye çalışırken, bunun üst öğesine üzerine yeniden ateşe yakaladı olay çalışarak numara değişse devre dışı bırakırken girdi sayfanın kaydırma ve odak korumak için aslında mümkün olduğunu fark <input type="number"/>
o yakalandı hangi , basitçe şöyle:
e.target.parentElement.dispatchEvent(e);
Ancak bu, tarayıcı konsolunda bir hataya neden oluyor ve kasıtlı olarak geçersiz bir kod olduğu için muhtemelen her yerde çalışacağı garanti edilmiyor (yalnızca Firefox'ta test ettim).
En azından Firefox ve Chromium'da iyi çalışan başka bir çözüm, <input>
öğeyi geçici olarak şu şekilde yapmaktır readOnly
:
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); });
Fark ettiğim bir yan etki, readOnly
alanlar için farklı stillere sahipseniz alanın bir anlığına titremesine neden olabileceğidir , ancak en azından benim durumum için bu bir sorun gibi görünmüyor.
Benzer şekilde, (James'in cevabında açıklandığı gibi) readOnly
özelliği değiştirmek yerine blur()
, alanı ve sonra focus()
geri alabilirsiniz, ancak yine, kullanımdaki stillere bağlı olarak bir miktar titreme meydana gelebilir.
Alternatif olarak, buradaki diğer yorumlarda da belirtildiği gibi, preventDefault()
bunun yerine sadece etkinliği arayabilirsiniz . Yalnızca wheel
odakta olan ve fare imlecinin altındaki sayı girdilerindeki olayları işlediğinizi varsayarsak (yukarıdaki üç koşul bunu belirtir), kullanıcı deneyimi üzerindeki olumsuz etki hiçbirine yakın olmayacaktır.