Czy można wyłączyć kółko przewijania, zmieniając liczbę w polu wejściowym? Bawiłem się CSS specyficznym dla webkit, aby usunąć spinner, ale chciałbym całkowicie pozbyć się tego zachowania. Lubię używać, type=number
ponieważ wyświetla ładną klawiaturę na iOS.
javascript
css
html
forms
kjs3
źródło
źródło
onscroll
obsługujący tylkoevent.preventDefault()
w nim?Odpowiedzi:
Zapobiegaj domyślnemu zachowaniu zdarzenia mousewheel na elementach wejściowych, takich jak sugerowane przez innych (wywołanie "blur ()" normalnie nie byłoby preferowanym sposobem, aby to zrobić, ponieważ nie byłoby to tym, czego chce użytkownik).
ALE. Unikałbym nasłuchiwania zdarzenia mousewheel na wszystkich elementach input-number przez cały czas i robiłbym to tylko wtedy, gdy element jest w centrum uwagi (wtedy istnieje problem). W przeciwnym razie użytkownik nie może przewijać strony, gdy wskaźnik myszy znajduje się w dowolnym miejscu nad elementem wejściowym.
Rozwiązanie dla jQuery:
(Deleguj zdarzenia fokusu do otaczającego elementu formularza - aby uniknąć wielu detektorów zdarzeń, które są niekorzystne dla wydajności).
źródło
źródło
Jeden odbiornik wydarzeń, który rządzi wszystkimi
Jest to podobne do @Simon Perepelitsa „s odpowiedzi w czystym js, ale nieco prostsze, ponieważ stawia jeden detektor zdarzeń na elemencie dokumentu i sprawdza, czy element skupiony jest wejście numer:
Jeśli chcesz wyłączyć przewijanie wartości w niektórych polach, ale nie w innych, po prostu zrób to:
z tym:
Jeśli wejście ma klasę noscroll, nie zmieni się przy przewijaniu, w przeciwnym razie wszystko pozostanie takie samo.
Przetestuj tutaj z JSFiddle
źródło
wheel
zamiastmousewheel
. Źródła: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event PS. To nie ja głosuję przeciw.http://jsfiddle.net/bQbDm/2/
Aby zapoznać się z przykładem jQuery i rozwiązaniem dla różnych przeglądarek, zobacz powiązane pytanie:
Odbiornik zdarzeń HTML5 do przewijania wprowadzania liczb - tylko Chrome
źródło
$(':input[type=number]' ).live('mousewheel',function(e){ $(this).blur(); });
użyłem rozmycia zamiast zapobiegania domyślnemu, aby nie blokowało przewijania strony!live()
jest przestarzałe. Teraz powinieneś użyćon()
:$(':input[type=number]').on('mousewheel',function(e){ $(this).blur(); });
wheel
zamiastmousewheel
. Źródła: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventMożesz po prostu użyć atrybutu HTML onwheel .
Ta opcja nie ma wpływu na przewijanie innych elementów strony.
I dodaj detektor dla wszystkich wejść, które nie działają w danych wejściowych utworzonych dynamicznie później.
Dodatkowo możesz usunąć strzałki wejściowe za pomocą CSS.
źródło
onBlur()
nie był zgodny z oczekiwaniami.return false
Zamiast tego ustawiam proste, żeby naprawdę „nic nie robić na kole”.<input type="number" onwheel="return false;">
@Semyon Perepelitsa
Jest na to lepsze rozwiązanie. Rozmycie usuwa fokus z wejścia i jest to efekt uboczny, którego nie chcesz. Zamiast tego należy użyć evt.preventDefault. Zapobiega to domyślnemu zachowaniu danych wejściowych podczas przewijania przez użytkownika. Oto kod:
źródło
wheel
zamiastmousewheel
. Źródła: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventNajpierw musisz zatrzymać zdarzenie kółka myszy przez:
mousewheel.disableScroll
e.preventDefault();
el.blur();
Pierwsze dwa podejścia zatrzymują przewijanie okna, a ostatnie usuwa fokus z elementu; z których oba są niepożądanymi skutkami.
Jednym z obejść jest użycie
el.blur()
i ponowne ustawienie elementu po opóźnieniu:źródło
var hadFocus = el.is(':focus');
przed rozmyciem, a następnie strażnik, aby ustawić limit czasu tylko wtedy, gdy hadFocs był prawdziwy.Podane odpowiedzi nie działają w przeglądarce Firefox (Quantum). Odbiornik zdarzeń należy zmienić z kółka myszy na kółko:
Ten kod działa na Firefox Quantum i Chrome.
źródło
Dla każdego, kto pracuje z Reactem i szuka rozwiązania. Odkryłem, że najłatwiejszym sposobem jest użycie właściwości onWheelCapture w komponencie Input w następujący sposób:
onWheelCapture={e => { e.target.blur() }}
źródło
Odmiana maszynopisu
Maszynopis musi wiedzieć, że pracujesz z elementem HTMLElement dla bezpieczeństwa typów, w przeciwnym razie zobaczysz wiele
Property 'type' does not exist on type 'Element'
rodzajów błędów.źródło
Próbując rozwiązać ten problem samodzielnie, zauważyłem, że w rzeczywistości można zachować przewijanie strony i fokus danych wejściowych, wyłączając zmiany liczbowe, próbując ponownie uruchomić przechwycone zdarzenie na elemencie nadrzędnym,
<input type="number"/>
na którym zostało przechwycone , po prostu w ten sposób:Jednak powoduje to błąd w konsoli przeglądarki i prawdopodobnie nie ma gwarancji, że będzie działać wszędzie (testowałem tylko w przeglądarce Firefox), ponieważ jest to celowo nieprawidłowy kod.
Innym rozwiązaniem, które działa ładnie przynajmniej na Firefoksie i Chromium, jest tymczasowe utworzenie
<input>
elementu wreadOnly
ten sposób:Jednym z efektów ubocznych, który zauważyłem, jest to, że może powodować migotanie pola na ułamek sekundy, jeśli masz inny styl
readOnly
pól, ale przynajmniej w moim przypadku nie wydaje się to stanowić problemu.Podobnie (jak wyjaśniono w odpowiedzi Jamesa) zamiast modyfikować
readOnly
właściwość, możnablur()
pole, a następniefocus()
przywrócić, ale znowu, w zależności od używanych stylów, może wystąpić migotanie.Alternatywnie, jak wspomniano w innych komentarzach, możesz po prostu zadzwonić
preventDefault()
na wydarzenie. Zakładając, że obsługujeszwheel
zdarzenia tylko na danych wejściowych liczbowych, które są w centrum uwagi i pod kursorem myszy (to właśnie oznaczają trzy powyższe warunki), negatywny wpływ na wrażenia użytkownika byłby bliski zeru.źródło
Jeśli potrzebujesz rozwiązania, które nie wymaga JavaScript, połączenie niektórych funkcji HTML z pseudoelementem CSS załatwia sprawę:
To działa, ponieważ kliknięcie zawartości
<label>
powiązanej z polem formularza spowoduje zaznaczenie pola. Jednak „okienko” pseudoelementu nad polem będzie blokować dotarcie do niego zdarzeń kółka myszy.Wadą jest to, że przyciski pokrętła góra / dół już nie działają, ale powiedziałeś, że i tak je usunąłeś.
Teoretycznie można przywrócić menu kontekstowe bez konieczności uprzedniego skupienia się na danych wejściowych:
:hover
style nie powinny uruchamiać się, gdy użytkownik przewija, ponieważ przeglądarki unikają ich ponownego obliczania podczas przewijania ze względu na wydajność, ale nie dokładnie między przeglądarkami / urządzeniami przetestowałem to.źródło
źródło
Najłatwiejszym rozwiązaniem jest dodanie
onWheel={ event => event.currentTarget.blur() }}
samego wejścia.źródło