Как сделать type = «number» только для положительных чисел

285

в настоящее время у меня есть следующий код

<input type="number" />

получается что-то вроде этого

введите описание изображения здесь

Маленькие селекторы справа позволяют цифре переходить в минус. Как мне это предотвратить?

У меня есть сомнения по поводу использования type="number", оно вызывает больше проблем, чем решает, я все равно собираюсь проверить его, так что я должен просто вернуться к использованию type="text"?

Ариан Фауртош
источник
4
Вам все еще нужно будет проверить значение на сервере. Любой может переопределить поле, чтобы отправить любой контент, который он хочет.
zzzzBov
2
@zzzzBov Да, я проверяю его с помощью php, а также использую операторы prepare, единственное, о чем нужно беспокоиться, это пользователи, которые ячменя знают, как использовать веб-браузер. LOL
Ариан Фауртош,

Ответы:

636

Добавить в minатрибут

<input type="number" min="0">

Quentin
источник
37
Это работает для стрелок селектора, но позволяет вводить отрицательное число
Дэвид Бертон
2
Изменение атрибута min="0.000001"поможет в большинстве случаев. Более 6 знаков после запятой, JavaScript преобразует его в экспоненциальный формат.
MarkMYoung
По умолчанию это разрешает только целые числа, но не десятичные. См. Разрешение десятичных значений .
ул
118

Я нашел другое решение для предотвращения отрицательного числа.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">
Kushal
источник
Вы не можете добавить плавающие числа с этим. Кроме того, числовой степпер здесь тоже не работает.
Hamzox
1
oninput="validity.valid||(value='');"останавливает один от набора-ve чисел
Привет Вселенная
5
Это должно быть помечено как правильный ответ, поскольку оно также не позволяет вводить символ "-"
JanBrus
Это прекрасно работает, если вам нужны только положительные целые числа, как я. Спасибо!
Борис
74

Это зависит от того, насколько точно вы хотите быть. Если вы хотите принимать только целые числа, чем:

<input type="number" min="1" step="1">

Если вы хотите плавать, например, с двумя цифрами после десятичной точки:

<input type="number" min="0.01" step="0.01">

Павло
источник
Кажется, в настоящее время это работает без шага = "1" ... я все еще должен добавить это?
Ариан Фауртош
@ Ариан, вы можете опустить его, если не указали maxзначение.
Павло
1
Шаг 1 - браузер по умолчанию, у вас все в порядке
Стефан Мюллер,
4
Это по-прежнему не мешает вводить неверные значения - если вы опустите значение шага, Chrome уменьшает проверку, которую он делает при наборе текста, чтобы вы могли вводить нечисловые значения. При установке шага он позволяет только вводить значения за пределами диапазона минимальных и максимальных значений - все еще неправильно, но лучше.
Дэвид Бертон
min = "1" step = "1" по-прежнему позволяет мне вводить числа с плавающей запятой, например 1.2. Как я могу форсировать только целые числа?
Сэм
51

Вы можете заставить ввод содержать только положительное целое число, добавив onkeypressв inputтег.

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

Вот, event.charCode >= 48 гарантируется, что возвращаются только числа, большие или равные 0, а minтег гарантирует, что вы можете прийти к минимуму 1, прокручивая строку ввода.

Шубхам Миттал
источник
3
На Edge вы можете ввести «А» в этом.
Эми Бланкеншип
10
Вы все еще можете вставить отрицательное число
метил
5

Вы можете использовать следующее, чтобы type="number"принимать только положительные числа:

input type="number" step="1" pattern="\d+"
Deepali
источник
2
Можете ли вы попытаться объяснить, что делает ваше утверждение и почему оно помогает? Кроме того, у вас есть два разных фрагмента. Который правильный?
Aenadon
2
добавляя атрибут шага, вы ограничиваете ввод целочисленным значением, а добавление шаблона гарантирует, что при использовании дробной части поле будет помечено как недействительное, но зависит от реализаций браузера (Firefox помечает поле как красный при потере фокуса ввода, тогда как Chrome не позволяет вы вводите запрещенные значения в первую очередь). Надо проверить это на сервере / клиенте.
Deepali
5

Вы можете предотвратить отрицательный ввод в форме ввода чисел следующим образом:

<input type="number" onkeyup="if(this.value<0){this.value= this.value * -1}">

Хафиджур Рахман Сакиб
источник
3

Пытаться

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">

Рожериу де Мораес
источник
Когда вы определяете тип, вам нужен определенный формат для роли.
Рожерио де Мораес
7
Пробовал это в Chrome, и это не навязывает шаблон
Дэвид Бертон
Есть ли способ, если я добавлю type = "text" вместо "number"?
Капил Верма
1

Если требуется ввод текста , шаблон работает также

<input type="text" pattern="\d+">
ABDO
источник
1

Я не могу найти идеальное решение, так как некоторые работы для ввода, но не для копирования и вставки, некоторые наоборот. Это решение работает для меня. Это предотвращает от отрицательного числа, набрав «е», скопировать и вставить «е» текст.

создать функцию.

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

добавить эти свойства для ввода. эти два препятствуют копированию и вставке нечислового текста, включая «е». Вы должны иметь оба вместе, чтобы вступить в силу.

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

Если вы используете Vue, вы можете обратиться к этому ответу здесь . Я извлек его в миксин, который можно использовать повторно.

Arst
источник
0

добавьте этот код в ваш тип ввода;

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

например:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />
Сакава Боб
источник
1
это действительно сбивает с толку тех, кто не понимает, что происходит.
RozzA
Таким образом, вы все равно можете вставить что-нибудь на ввод, алфавит или даже специальные символы
Lê Gia Lễ
0

Другое решение состоит в том, чтобы использовать Js, чтобы сделать его положительным (опция min может быть отключена и недействительна, когда пользователь вводит что-то). Отрицательное, если не нужно, также можно использовать событие on ('keydown')!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});
Андрес Пол
источник
0

Это зависит от того, хотите ли вы int или float. Вот как эти два будут выглядеть:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

К полю int прикреплена правильная проверка, поскольку его минимум равен 1. Однако, поле с плавающей запятой принимает 0; Чтобы справиться с этим, вы можете добавить еще один валидатор ограничений :

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle здесь.

Обратите внимание, что ни одно из этих решений не полностью препятствует тому, чтобы пользователь пытался ввести неверный ввод, но вы можете позвонить checkValidityилиreportValidity узнать, набрал ли пользователь допустимый ввод.

Конечно, вы все равно должны иметь проверку на стороне сервера, потому что пользователь всегда может игнорировать проверку на стороне клиента.

kevinji
источник
0

Попробуй это:

  • Проверено в Angular 8
  • значения положительные
  • Этот код также обрабатывает nullи negitiveзначения.
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />
geeth-маратхи
источник
0

Если вы попытаетесь ввести отрицательное число, событие onkeyup блокирует это, и если вы используете стрелку на входном номере, событие onblur разрешает эту часть.

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>

Виктор Чавес
источник
-2

С типом ввода текста вы можете использовать это для лучшей проверки,

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();
Анураг
источник
-4

Попробуй это:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
user10132380
источник