HTML5: тип ввода чисел, который принимает только целые числа?

205

Я использую jQuery Tools Validator, который реализует проверки HTML5 через jQuery. До сих пор он работал отлично, за исключением одного. В спецификации HTML5 тип ввода "число" может иметь как целые числа, так и числа с плавающей запятой. Это кажется невероятно близоруким, поскольку это будет только полезный валидатор, когда ваши поля базы данных будут подписаны с номерами с плавающей запятой (для неподписанных ints вам придется вернуться к проверке "шаблонов" и, следовательно, потерять дополнительные функции, такие как стрелки вверх и вниз для браузеров, которые его поддерживают). Есть ли другой тип ввода или, возможно, атрибут, который ограничивает ввод только целыми без знака? Я не мог найти, спасибо.

ИЗМЕНИТЬ

Хорошо, ребята, я ценю ваше время и помощь, но я вижу много незаслуженных голосований: D. Установка шага в 1 не является ответом, поскольку он не ограничивает ввод. Вы все равно можете ввести отрицательный номер с плавающей запятой в текстовое поле. Кроме того, мне известно о проверке шаблонов (я упомянул об этом в своем оригинальном посте), но это не было частью вопроса. Я хотел знать, допускает ли HTML5 ограничение ввода типа "число" на положительные целочисленные значения. На этот вопрос ответ, похоже, будет "нет, это не так". Я не хотел использовать проверку шаблонов, потому что это вызывает некоторые недостатки при использовании проверки JQuery Tools, но теперь кажется, что спецификация не позволяет более чистый способ сделать это.

  • 0
    По состоянию на 2019 год - с тех пор я не знаю - ввод number (по крайней мере, в FF / Chrome / Safari) теперь принимает по умолчанию только целые числа, если только вы не установили явное значение для атрибута step которое допускает десятичные значения; например: step="0.01" . Документированный MDN здесь . У меня две мысли об этом, потому что я думаю, что это разумное значение по умолчанию, но также и серьезное изменение (да, это повлияло на некоторый код, который я написал).
Теги:
validation
jquery-tools

20 ответов

273

https://www.w3.org/wiki/HTML/Elements/input/number

Лучшее, что вы можете достичь только с помощью HTML

    <input type="number" min="0" step="1"/>
  • 6
    Вы, вероятно, должны установить min в 1 как он хочет положительные числа (а не неотрицательные числа).
  • 1
    @pwdst Я буду вторым. <input type="number" min="0" step="1"/> - самый правильный ответ на вопрос. В любом случае, какой смысл иметь оба step="1" и pattern="\d+" ? Я не могу набирать числа с плавающей запятой в обоих случаях.
Показать ещё 8 комментариев
137

Установите для атрибута step значение 1:

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

В настоящее время это похоже на ошибку в Chrome, так что это может быть не лучшее решение на данный момент.

Лучшим решением является использование атрибута pattern, который использует регулярное выражение для ввода:

<input type="text" pattern="\d*" />

\d является регулярным выражением для числа, * означает, что он принимает более одного из них. Вот демо: http://jsfiddle.net/b8NrE/1/

  • 2
    Как выяснил JayPea, еще не все браузеры поддерживают все элементы HTML5, поэтому, как вы и предлагали, лучше всего обеспечить изящное унижение.
  • 1
    На Chrome 18, работающем под управлением Ubuntu, приведенная выше скрипка не работает. Атрибут числа делает, однако.
Показать ещё 10 комментариев
28

Простой способ использования JavaScript:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, ''); this.value = this.value.replace(/(\..*)\./g, '$1');" >
  • 0
    Я не понимаю, replace(/(\..*)\./g, '$1')
  • 3
    Это важно, чтобы принять числа с плавающей запятой и повторить . только один раз, например, 123.556 может быть записано.
Показать ещё 2 комментария
22
<input type="text" name="Phone Number" pattern="[0-9]{10}" title="Phone number">

Используя этот код, вход в текстовое ограничение feild вводит только цифры.... Шаблон - это новый атрибут, доступный в HTML5

Дополнение к атрибуту Patter

  • 0
    developer.mozilla.org/en-US/docs/Web/HTML/Element/...
  • 5
    В соответствии со спецификацией атрибут шаблона может использоваться только в том случае, если тип ввода - «Текст», «Поиск», «URL», «Телефон», «Электронная почта», «Пароль» (как показано здесь с типом «Текст»). Это означает, что при использовании этого метода теряется семантика типа ввода номера и, следовательно (что важно) числовых экранных клавиатур некоторых планшетов и телефонов.
Показать ещё 1 комментарий
13

Это не только для html5, все браузер работает нормально. попробуйте это

onkeyup="this.value=this.value.replace(/[^0-9]/g,'');"
  • 11
    Это плохо. На входе попробуйте: Shift + Home, Shift + End, Ctrl + A, Ctrl + C, Ctrl + V. oninput этого используйте oninput
  • 0
    Когда этот ответ был написан, HTML5 не был опубликован. @zanderwar
Показать ещё 1 комментарий
12

Образец хорош, но если вы хотите ограничить ввод номерами только с помощью type = "text", вы можете использовать oninput и regex, как показано ниже:

<input type="text" oninput="this.value=this.value.replace(/[^0-9]/g,'');" id="myId"/>

Я боюсь за меня:)

  • 0
    Это должен быть принятый ответ
6

Шаблон всегда предпочтительнее для ограничения, попробуйте oninput и min выполнить 1 для ввода только чисел от 1 до

<input type="text" min="1" oninput="this.value=this.value.replace(/[^0-9]/g,'');"
                                value=${var} >
  • 0
    Это очень интересное решение. Что для `value = $ {var}` есть?
  • 0
    @AcademyofProgrammer пример значения по умолчанию для этого ввода
5

попробовал ли вы установить атрибут step на 1, как этот

<input type="number" step="1" /> 
4

Да, HTML5 делает. Попробуйте этот код (w3school):

<!DOCTYPE html>
<html>
<body>

<form action="">
  Quantity (between 1 and 5): <input type="number" name="quantity" min="1" max="5" />
  <input type="submit" />
</form>

</body>
</html>

См. минимальный и максимальный пареметр? Я попробовал его с помощью Chrome 19 (работал) и Firefox 12 (не работал).

  • 0
    Это предполагает, что вы хотите известный диапазон. Но если вы хотите любое целое значение, будет это все еще работает?
3

Я работал в Chrome и имел некоторые проблемы, хотя я использовал атрибуты html. Я закончил с этим js-кодом

$("#element").on("input", function(){
        var value = $(this).val();

        $(this).val("");
        $(this).val(parseInt(value));

        return true;
});
  • 0
    Я закончил тем, что использовал это также с 1 незначительной настройкой; Я изменил parseInt (значение) на parseInt (value.replace ('.', ''). Это позволило мне вставить 1,56 и сохранить отображаемое значение на уровне 156 вместо 1.
3

Установите step="any". Работает отлично. Ссылка: http://blog.isotoma.com/2012/03/html5-input-typenumber-and-decimalsfloats-in-chrome/

2

Возможно, это не подходит для каждого случая использования, но

<input type="range" min="0" max="10" />

может сделать прекрасную работу: скрипка.

Проверьте документацию.

2

Просто поместите его в поле ввода: onkeypress='return event.charCode >= 48 && event.charCode <= 57'

2
var valKeyDown;
var valKeyUp;


function integerOnly(e) {
    e = e || window.event;
    var code = e.which || e.keyCode;
    if (!e.ctrlKey) {
        var arrIntCodes1 = new Array(96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 8, 9, 116);   // 96 TO 105 - 0 TO 9 (Numpad)
        if (!e.shiftKey) {                          //48 to 57 - 0 to 9 
            arrIntCodes1.push(48);                  //These keys will be allowed only if shift key is NOT pressed
            arrIntCodes1.push(49);                  //Because, with shift key (48 to 57) events will print chars like @,#,$,%,^, etc.
            arrIntCodes1.push(50);
            arrIntCodes1.push(51);
            arrIntCodes1.push(52);
            arrIntCodes1.push(53);
            arrIntCodes1.push(54);
            arrIntCodes1.push(55);
            arrIntCodes1.push(56);
            arrIntCodes1.push(57);
        }
        var arrIntCodes2 = new Array(35, 36, 37, 38, 39, 40, 46);
        if ($.inArray(e.keyCode, arrIntCodes2) != -1) {
            arrIntCodes1.push(e.keyCode);
        }
        if ($.inArray(code, arrIntCodes1) == -1) {
            return false;
        }
    }
    return true;
}

$('.integerOnly').keydown(function (event) {
    valKeyDown = this.value;
    return integerOnly(event);
});

$('.integerOnly').keyup(function (event) {          //This is to protect if user copy-pastes some character value ,..
    valKeyUp = this.value;                          //In that case, pasted text is replaced with old value,
    if (!new RegExp('^[0-9]*$').test(valKeyUp)) {   //which is stored in 'valKeyDown' at keydown event.
        $(this).val(valKeyDown);                    //It is not possible to check this inside 'integerOnly' function as,
    }                                               //one cannot get the text printed by keydown event 
});                                                 //(that why, this is checked on keyup)

$('.integerOnly').bind('input propertychange', function(e) {    //if user copy-pastes some character value using mouse
    valKeyUp = this.value;
    if (!new RegExp('^[0-9]*$').test(valKeyUp)) {
        $(this).val(valKeyDown);
    }
});
2

Установите атрибут step для любого числа с плавающей точкой, например. 0,01, и вам хорошо идти.

2

Из спецификаций

step="any" или положительный номер с плавающей запятой
Задает значение детализации значения элементов.

Итак, вы можете просто установить его на 1:

  • 6
    Я пробовал это, но проблема в том, что вы все еще можете ввести число с плавающей запятой в текстовом поле.
  • 0
    Итак, вам нужен код, который блокирует пользователя от ввода десятичной точки?
0

В настоящее время невозможно предотвратить ввод пользователем десятичных значений в ваш ввод только с помощью HTML. Вы должны использовать javascript.

0
 <input type="number" min="0" step="1" pattern="\d+"/>
0

Кстати, кажется, что если у вас есть что-то другое, кроме числа в входе "число", val() и т.д. возвращает "". Я только что поставил чек и, похоже, работал на то, что мне нужно (ограничение буквы и других символов).

if( var == '' ) {
    alert( 'Var is not a number' );
}

Работает с ведущими нулями, десятичными точками и т.д.

-3

В Future (см. Раздел "Могу ли я использовать") на пользовательских агентах, которые представляют вам клавиатуру, вы можете ограничить ввод текста только числовым с помощью input[inputmode].

  • 0
    inputmode предназначен в основном для портативных устройств и будет вызывать правильную раскладку клавиатуры, но для «обычных» компьютеров с клавиатурой он не помешает вводить то, что вы хотите.
  • 0
    Вы правы @vsync, я обновил свой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню