Beim Versuch, dies für mich selbst zu lösen, habe ich festgestellt, dass es tatsächlich möglich ist, das Scrollen der Seite und den Fokus der Eingabe beizubehalten, während Nummernänderungen deaktiviert werden, indem versucht wird, das abgefangene Ereignis auf dem übergeordneten Element des abgefangenen Elements <input type="number"/>
erneut auszulösen einfach so:
e.target.parentElement.dispatchEvent(e);
Dies führt jedoch zu einem Fehler in der Browserkonsole und funktioniert wahrscheinlich nicht überall (ich habe nur auf Firefox getestet), da es sich absichtlich um ungültigen Code handelt.
Eine andere Lösung, die zumindest unter Firefox und Chrom gut funktioniert, besteht darin, das <input>
Element vorübergehend readOnly
wie folgt zu erstellen :
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); });
Ein Nebeneffekt, den ich bemerkt habe, ist, dass das Feld möglicherweise für den Bruchteil einer Sekunde flackert, wenn Sie ein anderes Styling für readOnly
Felder haben, aber zumindest für meinen Fall scheint dies kein Problem zu sein.
In ähnlicher Weise können Sie (wie in James 'Antwort erläutert), anstatt die readOnly
Eigenschaft zu ändern , blur()
das Feld und dann focus()
wieder zurück, aber abhängig von den verwendeten Stilen kann es erneut zu Flackern kommen.
Alternativ können Sie, wie in anderen Kommentaren hier erwähnt, preventDefault()
stattdessen einfach die Veranstaltung aufrufen . Angenommen, Sie behandeln wheel
Ereignisse nur an Zahleneingaben, die im Fokus und unter dem Mauszeiger stehen (das bedeuten die drei oben genannten Bedingungen), dann wären die negativen Auswirkungen auf die Benutzererfahrung nahezu gleich Null.