Это заблокирует ввод отрицательного числа с помощью кнопок со стрелками / счетчика. Однако пользователь все еще может вручную ввести отрицательное число и считать значение этого поля как отрицательное число, минуя атрибут min.
Экброди
52
@demaniak Нет. И как этот ответ получил столько голосов, когда наполовину ответил на вопрос - загадка
GôTô
1
@Abraham Что делать, если данные, загруженные со значением -ve в форме, не помечают его как красный.
Камини
2
Это не работает, пользователь все еще может ввести отрицательное число вручную.
Проголосовано, но я думаю, что это поможет уточнить, какие коды клавиш проверяются:> 95, <106 соответствует цифровой клавиатуре от 0 до 9; > 47, <58 соответствует 0-9 в строке чисел; и 8 это Backspace. Таким образом, этот скрипт не позволяет вводить какие-либо ключи, кроме тех, которые введены. Это тщательно, но я думаю, что это может быть излишним для браузеров, которые изначально поддерживают ввод чисел, которые уже отфильтровывают буквенные клавиши (за исключением символов, таких как «е», которые могут иметь числовое значение). Вероятно, было бы достаточно предотвратить 189 (тире) и 109 (вычесть). А затем объединить с min="0".
Хью Гиней
1
@Manwal Ограничивает копирование и вставку чисел с помощью клавиатуры. И позволяет мне копировать вставить отрицательные числа с помощью мыши.
Бенитон
1
@Beniton Спасибо, давая этот вариант использования. Можете ли вы дать мне небольшое представление о том, что вы делаете. Всегда я могу вам помочь. Пожалуйста, предоставьте небольшой исполняемый код или скрипку. Вы можете иметь форму подтверждения уровня отправки в вашем коде. Хотя у меня всегда есть проверка в Backend, если я не разрешаю отрицательные числа.
Манвал
1
Просто скопируйте и вставьте в поле в основном. Это не совсем особый случай или что-то в этом роде. Вместо того, чтобы обрабатывать проверку с помощью ключевого кода, вероятно, лучше сделать это с помощью onChange или focusOut и создать небольшую функцию проверки для отлова любых отрицательных чисел.
ulisesrmzroche
1
Условие для клавиши со стрелкой (37, 38, 39, 41) также должно быть поставлено. || (e.keyCode>36 && e.keyCode<41)Это не позволяет пользователю увеличивать / уменьшать число с помощью стрелок вверх / вниз и идти вправо / влево для редактирования номера.
Действительно лучшее решение, если вы используете pattern и noformvalidate с angular, поскольку модель не обновляется, если не находится в пределах диапазона. Мой случай:<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
Себиус
это работает лучше всего, когда пользователь знает, что значение по умолчанию равно 0. Другой мудрый пользователь запутается при нажатии на клавишу возврата, почему поле не очищается. Кроме этого, это лучшее решение. + 1
Deep 3015
1
ты спас мой день
stackmalux
Это работает лучше всего, и в случае использования десятичной также. Я использовал другой ответ выше, он перестал работать, когда разрешен десятичный. Есть ли способ, которым мы можем переместить этот ответ так, чтобы люди могли использовать это в основном.
Субхан Ахмед
31
Этот код работает нормально для меня. Можете ли вы проверить:
Пожалуйста, подумайте из коробки. Вы действительно уверены, что это keypressединственный способ ввести отрицательное число во входные данные ...
Roko C. Buljan
6
Ответ @Manwal хорош, но мне нравится код с меньшим количеством строк кода для лучшей читабельности. Также мне нравится использовать onclick / onkeypress в html.
Мое предлагаемое решение делает то же самое: Добавить
min="0" onkeypress="return isNumberKey(event)"
на ввод HTML и
function isNumberKey(evt){var charCode =(evt.which)? evt.which :event.keyCode;return!(charCode >31&&(charCode <48|| charCode >57));}
как функция JavaScript.
Как сказано, он делает то же самое. Это просто личное предпочтение в том, как решить проблему.
Это работает нормально, если пользователь фокусируется вне поля ввода, однако, если они сразу же нажимают клавишу ввода, оставаясь в поле; они все еще могут ввести отрицательное число.
NemyaNation
3
Вот угловое 2 решение:
создать класс OnlyNumber
import{Directive,ElementRef,HostListener}from'@angular/core';@Directive({
selector:'[OnlyNumber]'})exportclassOnlyNumber{// Allow decimal numbers. The \. is only allowed once to occurprivate regex:RegExp=newRegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);// Allow key codes for special events. Reflect :// Backspace, tab, end, homeprivate specialKeys:Array<string>=['Backspace','Tab','End','Home'];constructor(private el:ElementRef){}@HostListener('keydown',['$event'])
onKeyDown(event:KeyboardEvent){// Allow Backspace, tab, end, and home keysif(this.specialKeys.indexOf(event.key)!==-1){return;}// Do not use event.keycode this is deprecated.// See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCodelet current:string=this.el.nativeElement.value;// We need this because the current value on the DOM element// is not yet updated with the value from this eventletnext:string= current.concat(event.key);if(next&&!String(next).match(this.regex)){event.preventDefault();}}}
добавьте OnlyNumber к объявлениям в app.module.ts и используйте его в любом месте вашего приложения
Есть ли способ разрешить вставку для этого? Кроме того, я изменил регулярное выражение на: /^-?[0-9]+(\.[0-9]*)‹0,1‹$/g, чтобы разрешить отрицательные числа, но, похоже, это не работает?
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин, по которым вы предлагаете код.
Судхиш Синганамалла
Хотя это может быть правильным ответом, в нем недостаточно подробностей. Объясните пожалуйста почему это работает. При использовании переполнения стека учитывайте, что это живая база знаний , ответы, которые не делятся знаниями, гораздо менее полезны.
Marc LaFleur
2
Просто добавьте еще один способ сделать это (используя Angular), если вы не хотите портить HTML еще большим количеством кода:
Вам нужно только подписаться на поле valueChanges и установить значение как абсолютное значение. (заботясь о том, чтобы не генерировать новое событие, поскольку это вызовет другое значение valueChange, а следовательно, рекурсивный вызов и вызовет ошибку превышения максимального размера вызова)
Ответ на это не полезен. поскольку он работает только при использовании клавиш вверх / вниз, но если вы введете -11, он не будет работать. Итак, вот небольшое исправление, которое я использую
Это решение позволяет использовать все функции клавиатуры, включая копирование и вставку с клавиатуры. Это предотвращает вставку отрицательных чисел с помощью мыши. Работает со всеми браузерами и демо на codepen использует bootstrap и jQuery. Это должно работать с неанглийскими настройками и клавиатурой. Если браузер не поддерживает захват события вставки (IE), он удалит отрицательный знак после фокусировки. Это решение ведет себя так, как должен работать нативный браузер с min = 0 type = number.
Ответы:
Используйте
min
атрибут как это:источник
Я не был удовлетворен ответом @Abhrabm, потому что:
Решение состоит в том, чтобы предотвратить с помощью ключевого кода :
Уточнение предоставлено @Hugh Guiney :
Какие коды ключей проверяются:
источник
min="0"
.|| (e.keyCode>36 && e.keyCode<41)
Это не позволяет пользователю увеличивать / уменьшать число с помощью стрелок вверх / вниз и идти вправо / влево для редактирования номера.Для меня решение было:
источник
<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
Этот код работает нормально для меня. Можете ли вы проверить:
источник
-
, не очень хорошая идея.<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">
- это удалит все нецифровые символыmin="0"
так что нет никаких отрицательных. Если вы хотите получить отрицательное значение, удалите этот атрибут.Простой метод:
источник
Я хотел разрешить десятичные числа и не очистить весь ввод, если был введен отрицательный. Это хорошо работает в Chrome, по крайней мере:
источник
keypress
единственный способ ввести отрицательное число во входные данные ...Ответ @Manwal хорош, но мне нравится код с меньшим количеством строк кода для лучшей читабельности. Также мне нравится использовать onclick / onkeypress в html.
Мое предлагаемое решение делает то же самое: Добавить
на ввод HTML и
как функция JavaScript.
Как сказано, он делает то же самое. Это просто личное предпочтение в том, как решить проблему.
источник
Просто для справки: с помощью jQuery вы можете перезаписывать отрицательные значения в focusout с помощью следующего кода:
Это не заменяет проверку на стороне сервера!
источник
Вот угловое 2 решение:
создать класс OnlyNumber
добавьте OnlyNumber к объявлениям в app.module.ts и используйте его в любом месте вашего приложения
источник
источник
Просто добавьте еще один способ сделать это (используя Angular), если вы не хотите портить HTML еще большим количеством кода:
Вам нужно только подписаться на поле valueChanges и установить значение как абсолютное значение. (заботясь о том, чтобы не генерировать новое событие, поскольку это вызовет другое значение valueChange, а следовательно, рекурсивный вызов и вызовет ошибку превышения максимального размера вызова)
HTML-код
КОД TypeScript (внутри вашего компонента)
источник
источник
Ответ на это не полезен. поскольку он работает только при использовании клавиш вверх / вниз, но если вы введете -11, он не будет работать. Итак, вот небольшое исправление, которое я использую
этот для целых
этот, когда у вас есть номера цены
источник
Это решение позволяет использовать все функции клавиатуры, включая копирование и вставку с клавиатуры. Это предотвращает вставку отрицательных чисел с помощью мыши. Работает со всеми браузерами и демо на codepen использует bootstrap и jQuery. Это должно работать с неанглийскими настройками и клавиатурой. Если браузер не поддерживает захват события вставки (IE), он удалит отрицательный знак после фокусировки. Это решение ведет себя так, как должен работать нативный браузер с min = 0 type = number.
Разметка:
Javascript
источник
Вот решение, которое работает лучше всего для поля QTY, которое допускает только числа.
источник
источник