Можно ли отключить колесо прокрутки, изменяя число в поле ввода номера? Я испортил специфичный для webkit CSS, чтобы удалить счетчик, но я хотел бы полностью избавиться от этого поведения. Мне нравится использоватьtype=number
потому что он вызывает красивую клавиатуру на iOS.
javascript
css
html
forms
kjs3
источник
источник
onscroll
обработчик толькоevent.preventDefault()
в нем?Ответы:
Предотвратить поведение по умолчанию события колеса мыши для элементов input-number, как это было предложено другими (вызов «blur ()» обычно не является предпочтительным способом сделать это, потому что это не то, что хочет пользователь).
НО. Я бы избегал постоянно прослушивать событие колесика мыши на всех элементах input-number и делал это только тогда, когда элемент находится в фокусе (когда проблема существует). В противном случае пользователь не сможет прокручивать страницу когда указатель мыши находится где-нибудь над элементом input-number.
Решение для jQuery:
(Делегируйте события фокуса на окружающий элемент формы - чтобы избежать использования множества прослушивателей событий, которые плохо сказываются на производительности.)
источник
источник
Один слушатель событий, чтобы управлять ими всеми
Это похоже на @Simon Перепелица «s ответа в чистом JS, но немного проще, так как она кладет слушатель событий на элементе документа и проверяет , если сфокусированный элемент ввод номера:
Если вы хотите отключить прокрутку значений в некоторых полях, но не в других, просто сделайте это вместо этого:
с этим:
Если вход имеет класс noscroll, он не изменится при прокрутке, в противном случае все останется прежним.
Протестируйте здесь с помощью JSFiddle
источник
wheel
вместоmousewheel
. Ссылка: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event PS. Я не тот, кто голосует против.http://jsfiddle.net/bQbDm/2/
Для примера jQuery и кросс-браузерного решения см. Связанный вопрос:
Слушатель событий HTML5 для прокрутки ввода чисел - только Chrome
источник
$(':input[type=number]' ).live('mousewheel',function(e){ $(this).blur(); });
я использовал размытие вместо предотвращения по умолчанию, чтобы он не блокировал прокрутку страницы!live()
устарел. Теперь вы должны использоватьon()
:$(':input[type=number]').on('mousewheel',function(e){ $(this).blur(); });
wheel
вместоmousewheel
. Ссылка: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventВы можете просто использовать атрибут HTML onwheel .
Этот параметр не влияет на прокрутку других элементов страницы.
И добавьте слушателя для всех входов, которые не работают во входах, динамически создаваемых позже.
Кроме того, вы можете удалить стрелки ввода с помощью CSS.
источник
onBlur()
оказалось не так, как ожидалось.return false
Вместо этого я установил простое, чтобы действительно «ничего не делать на колесе».<input type="number" onwheel="return false;">
@Semyon Perepelitsa
Для этого есть лучшее решение. Размытие удаляет фокус с ввода, и это побочный эффект, который вам не нужен. Вместо этого вы должны использовать evt.preventDefault. Это предотвращает поведение ввода по умолчанию при прокрутке пользователем. Вот код:
источник
wheel
вместоmousewheel
. Ссылка: developer.mozilla.org/en-US/docs/Web/API/Element/wheel_eventСначала вы должны остановить событие колесика мыши:
mousewheel.disableScroll
e.preventDefault();
el.blur();
Первые два подхода останавливают прокрутку окна, а последний удаляет фокус с элемента; Оба эти результата являются нежелательными.
Один из обходных путей - использовать
el.blur()
и перефокусировать элемент после задержки:источник
var hadFocus = el.is(':focus');
перед размытием, а затем охранник, чтобы установить тайм-аут только в том случае, если hasFocs был истинным.Для всех, кто работает с React и ищет решение. Я обнаружил, что самый простой способ - использовать свойство onWheelCapture в компоненте Input следующим образом:
onWheelCapture={e => { e.target.blur() }}
источник
Предоставленные ответы не работают в Firefox (Quantum). Слушатель событий необходимо изменить с колеса мыши на колесо:
Этот код работает в Firefox Quantum и Chrome.
источник
Машинописный вариант
TypeScript должен знать, что вы работаете с HTMLElement для обеспечения безопасности типов, иначе вы увидите много
Property 'type' does not exist on type 'Element'
типов ошибок.источник
Пытаясь решить эту проблему для себя, я заметил, что на самом деле можно сохранить прокрутку страницы и фокус ввода при отключении изменения числа, попытавшись повторно запустить событие catch на родительском элементе того,
<input type="number"/>
на котором оно было поймано. , просто так:Однако это вызывает ошибку в консоли браузера и, вероятно, не гарантирует, что будет работать везде (я тестировал только в Firefox), поскольку это намеренно недействительный код.
Другое решение, которое хорошо работает, по крайней мере, в Firefox и Chromium, - это временно создать
<input>
элементreadOnly
, например:Один из побочных эффектов, который я заметил, заключается в том, что поле может мигать на долю секунды, если у вас другой стиль для
readOnly
полей, но, по крайней мере, для моего случая это не кажется проблемой.Точно так же (как объяснено в ответе Джеймса) вместо изменения
readOnly
свойства вы можетеblur()
заполнить поле, а затемfocus()
вернуть его обратно, но опять же, в зависимости от используемых стилей, может возникнуть некоторое мерцание.В качестве альтернативы, как упоминалось в других комментариях здесь, вы можете просто позвонить
preventDefault()
на мероприятие. Предполагая, что вы обрабатываетеwheel
события только для числовых входов, которые находятся в фокусе и под курсором мыши (это то, что означают три вышеуказанных условия), негативное влияние на взаимодействие с пользователем будет практически нулевым.источник
Если вам нужно решение, для которого не нужен JavaScript, можно использовать сочетание некоторых функций HTML с псевдоэлементом CSS:
Это работает, потому что нажатие на содержимое
<label>
, связанное с полем формы, приведет к фокусированию поля. Однако «оконное стекло» псевдоэлемента над полем будет блокировать доступ событий колесика мыши к нему.Недостатком является то, что кнопки счетчика вверх / вниз больше не работают, но вы сказали, что все равно их удалили.
Теоретически можно восстановить контекстное меню, не требуя, чтобы ввод был сначала сфокусирован:
:hover
стили не должны срабатывать, когда пользователь прокручивает, поскольку браузеры избегают их пересчета во время прокрутки из соображений производительности, но я не полностью кроссбраузерность / устройство протестировал это.источник
источник
Самое простое решение - добавить
onWheel={ event => event.currentTarget.blur() }}
сам ввод.источник