Ist es möglich, das Scrollrad zu deaktivieren, indem die Nummer in einem eingegebenen Nummernfeld geändert wird? Ich habe mit Webkit-spezifischem CSS herumgespielt, um den Spinner zu entfernen, aber ich möchte dieses Verhalten insgesamt beseitigen. Ich benutze type=number
es gerne, da es eine schöne Tastatur unter iOS aufruft.
javascript
css
html
forms
kjs3
quelle
quelle
onscroll
Handler hinzufügen, der nurevent.preventDefault()
darin enthalten ist?Antworten:
Verhindern Sie das Standardverhalten des Mausrad-Ereignisses bei Elementen mit Eingabenummer, wie von anderen vorgeschlagen (der Aufruf von "blur ()" ist normalerweise nicht die bevorzugte Methode, da dies nicht den Wünschen des Benutzers entspricht).
ABER. Ich würde es vermeiden, ständig auf alle Elemente der Eingabenummer auf das Mausrad-Ereignis zu warten, und dies nur tun, wenn das Element im Fokus steht (dann besteht das Problem). Andernfalls kann der Benutzer nicht durch die Seite scrollen, wenn sich der Mauszeiger irgendwo über einem Element mit einer eingegebenen Nummer befindet.
Lösung für jQuery:
(Delegieren Sie Fokusereignisse an das umgebende Formularelement, um zu vermeiden, dass viele Ereignis-Listener die Leistung beeinträchtigen.)
quelle
quelle
Ein Ereignis-Listener, der sie alle regiert
Dies ist ähnlich wie @ Simon Perepelitsa ‚s Antwort in reinen js, aber ein bisschen einfacher, als es ein Ereignis - Listener auf dem Dokumentelement und prüft , setzt , wenn das fokussierte Element eine Nummer eingegeben wird:
Wenn Sie das Wert-Bildlauf-Verhalten für einige Felder deaktivieren möchten, für andere jedoch nicht, tun Sie stattdessen Folgendes:
mit diesem:
Wenn eine Eingabe die Noscroll-Klasse hat, ändert sie sich beim Scrollen nicht, andernfalls bleibt alles beim Alten.
Testen Sie hier mit JSFiddle
quelle
wheel
anstelle vonmousewheel
. Referenz: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event PS. Ich bin nicht derjenige, der abstimmt.http://jsfiddle.net/bQbDm/2/
Ein jQuery-Beispiel und eine browserübergreifende Lösung finden Sie in der zugehörigen Frage:
HTML5-Ereignis-Listener für die Eingabe von Zahlen - nur Chrome
quelle
$(':input[type=number]' ).live('mousewheel',function(e){ $(this).blur(); });
Ich habe Unschärfe verwendet, anstatt die Standardeinstellung zu verhindern, damit die Seite nicht gescrollt wird!live()
ist veraltet. Jetzt sollten Sie verwendenon()
:$(':input[type=number]').on('mousewheel',function(e){ $(this).blur(); });
wheel
anstelle vonmousewheel
. Referenz: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventSie können einfach das HTML- Onwheel- Attribut verwenden.
Diese Option hat keine Auswirkungen auf das Scrollen über andere Elemente der Seite.
Und fügen Sie einen Listener für alle Eingaben hinzu, die bei dynamisch nachträglich erstellten Eingaben nicht funktionieren.
Zusätzlich können Sie die Eingabepfeile mit CSS entfernen.
quelle
onBlur()
nicht wie erwartet. Ich richtereturn false
stattdessen ein einfaches ein, um wirklich "nichts auf dem Rad zu tun".<input type="number" onwheel="return false;">
@ Semyon Perepelitsa
Dafür gibt es eine bessere Lösung. Unschärfe entfernt den Fokus von der Eingabe und das ist ein Nebeneffekt, den Sie nicht wollen. Sie sollten stattdessen evt.preventDefault verwenden. Dies verhindert das Standardverhalten der Eingabe beim Scrollen des Benutzers. Hier ist der Code:
quelle
wheel
anstelle vonmousewheel
. Referenz: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventZuerst müssen Sie das Mausrad-Ereignis stoppen, indem Sie entweder:
mousewheel.disableScroll
e.preventDefault();
el.blur();
Die ersten beiden Ansätze verhindern das Scrollen des Fensters und der letzte entfernt den Fokus vom Element. Beides sind unerwünschte Ergebnisse.
Eine Problemumgehung besteht darin
el.blur()
, das Element nach einer Verzögerung zu verwenden und neu zu fokussieren:quelle
var hadFocus = el.is(':focus');
festzustellen, ob das Element den Fokus hatte: vor dem Verwischen, und dann ein Schutz, um das Zeitlimit nur festzulegen, wenn hadFocs wahr ist.Die angegebenen Antworten funktionieren in Firefox (Quantum) nicht. Der Ereignis-Listener muss vom Mausrad zum Rad gewechselt werden:
Dieser Code funktioniert unter Firefox Quantum und Chrome.
quelle
Für alle, die mit React arbeiten und nach einer Lösung suchen. Ich habe herausgefunden, dass der einfachste Weg darin besteht, die onWheelCapture-Requisite in der Eingabekomponente wie folgt zu verwenden:
onWheelCapture={e => { e.target.blur() }}
quelle
Typoskript-Variation
Typescript muss wissen, dass Sie aus Gründen der Typensicherheit mit einem HTMLElement arbeiten. Andernfalls werden viele
Property 'type' does not exist on type 'Element'
Arten von Fehlern angezeigt .quelle
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: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übergehendreadOnly
wie folgt zu erstellen :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 dannfocus()
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 behandelnwheel
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.quelle
Wenn Sie eine Lösung suchen, die kein JavaScript benötigt, reicht die Kombination einiger HTML-Funktionen mit einem CSS-Pseudoelement aus:
Dies funktioniert, weil durch Klicken auf den Inhalt
<label>
eines Felds, das einem Formularfeld zugeordnet ist, das Feld fokussiert wird. Die „Fensterscheibe“ des Pseudoelements über dem Feld verhindert jedoch, dass Mausradereignisse es erreichen.Der Nachteil ist, dass die Auf- / Ab-Drehknöpfe nicht mehr funktionieren, aber Sie sagten, Sie hätten diese trotzdem entfernt.
Theoretisch könnte man das Kontextmenü wiederherstellen, ohne dass die Eingabe zuerst fokussiert werden muss:
:hover
Stile sollten nicht ausgelöst werden, wenn der Benutzer einen Bildlauf durchführt, da Browser es aus Leistungsgründen vermeiden, sie während des Bildlaufs neu zu berechnen, aber ich habe Browser / Gerät nicht gründlich übergreifend habe es getestet.quelle
quelle
Die einfachste Lösung besteht darin, die
onWheel={ event => event.currentTarget.blur() }}
Eingabe selbst hinzuzufügen .quelle