HTML text input allow only numeric input

Есть ли быстрый способ установить ввод текста HTML (<input type=text />) разрешить только числовые нажатия клавиш (плюс '.')?

82 ответа

Решение

JavaScript

Примечание. Это обновленный ответ. Комментарии ниже относятся к старой версии, которая путалась с кодами клавиш.

setInputFilter Функция из приведенного ниже скрипта позволяет использовать любой тип входного фильтра для текста <input>, включая различные числовые фильтры. Это будет правильно обрабатывать Copy+Paste, Drag+Drop, сочетания клавиш, операции контекстного меню, не типизируемые клавиши, положение курсора, все раскладки клавиатуры и все браузеры начиная с IE 9. Обратите внимание, что вы все равно должны выполнить проверку на стороне сервера!

Попробуйте сами на JSFiddle.

// Restricts input for the given textbox to the given inputFilter.
function setInputFilter(textbox, inputFilter) {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      }
    });
  });
}

Использование:

// Restrict input to digits and '.' by using a regular expression filter.
setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value);
});

Некоторые входные фильтры, которые вы можете использовать:

  • Целочисленные значения (как положительные, так и отрицательные):
    /^-?\d*$/.test(value)
  • Целочисленные значения (только положительные):
    /^\d*$/.test(value)
  • Целочисленные значения (положительные и до определенного предела):
    /^\d*$/.test(value) && (value === "" || parseInt(value) <= 500)
  • Значения с плавающей точкой (допускающие оба . а также , в качестве десятичного разделителя):
    /^-?\d*[.,]?\d*$/.test(value)
  • Значения валют (т.е. не более двух десятичных знаков):
    /^-?\d*[.,]?\d{0,2}$/.test(value)
  • Шестнадцатеричные значения:
    /^[0-9a-f]*$/i.test(value)

JQuery

Существует также версия JQuery этого. Посмотрите этот ответ или попробуйте сами на JSFiddle.

HTML 5

HTML 5 имеет собственное решение с <input type="number"> (см. спецификацию), но обратите внимание, что поддержка браузера может быть разной:

  • Большинство браузеров проверяют ввод только при отправке формы, а не при вводе.
  • Большинство мобильных браузеров не поддерживают step, min а также max атрибутов.
  • Chrome (версия 71.0.3578.98) по-прежнему позволяет пользователю вводить символы e а также E в поле. Также смотрите этот вопрос.
  • Firefox (версия 64.0) и Edge (EdgeHTML версия 17.17134) по-прежнему позволяют пользователю вводить любой текст в поле.

Попробуйте сами на w3schools.com.

Более сложные параметры проверки

Если вы хотите выполнить некоторые другие проверки, это может быть удобно:

Используйте этот DOM

<input type='text' onkeypress='validate(event)' />

И этот сценарий

function validate(evt) {
  var theEvent = evt || window.event;

  // Handle paste
  if (theEvent.type === 'paste') {
      key = event.clipboardData.getData('text/plain');
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}

Вот простой, который учитывает ровно один десятичный знак, но не более:

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

Я искал долго и упорно за хороший ответ на это, и мы отчаянно нуждаемся <input type="number"Но, если не считать этого, эти 2 - самые краткие способы, которыми я мог придумать:

<input type="text" 
       onkeyup="this.value=this.value.replace(/[^\d]/,'')">

Если вам не нравится недопустимый символ, отображаемый в течение доли секунды перед удалением, мой метод ниже. Обратите внимание на многочисленные дополнительные условия, чтобы избежать отключения всех видов навигации и горячих клавиш. Если кто-нибудь знает, как это компактифицировать, сообщите нам!

<input type="text" 
onkeydown="return ( event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (event.keyCode==9) 
                    || (event.keyCode>34 && event.keyCode<40) 
                    || (event.keyCode==46) )">

Большинство ответов здесь имеют слабость использования ключевых событий.

Многие ответы ограничат вашу способность делать выбор текста с помощью клавиатурных макросов, копирования + вставки и более нежелательного поведения, другие, похоже, зависят от конкретных плагинов jQuery, которые убивают мух с помощью пулеметов.

Это простое решение, кажется, лучше всего подходит для кроссплатформенности, независимо от механизма ввода (нажатие клавиш, копирование + вставка, щелчок правой кнопкой мыши на копирование + вставка, преобразование речи в текст и т. Д.). Все макросы клавиатуры для выделения текста по-прежнему будут работать, и это даже ограничит возможность установки нечислового значения скриптом.

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);

HTML5 поддерживает регулярные выражения, поэтому вы можете использовать это:

<input id="numbersOnly" pattern="[0-9.]+" type="text">

Предупреждение: некоторые браузеры пока не поддерживают это.

HTML5 имеет <input type=number>, который звучит правильно для вас. В настоящее время только Opera поддерживает его изначально, но есть проект, который имеет реализацию JavaScript.

И еще один пример, который прекрасно работает для меня:

function validateNumber(event) {
    var key = window.event ? event.keyCode : event.which;
    if (event.keyCode === 8 || event.keyCode === 46) {
        return true;
    } else if ( key < 48 || key > 57 ) {
        return false;
    } else {
        return true;
    }
};

Также прикрепить к событию нажатия клавиши

$(document).ready(function(){
    $('[id^=edit]').keypress(validateNumber);
});

И HTML:

<input type="input" id="edit1" value="0" size="5" maxlength="5" />

Вот пример jsFiddle

Я решил использовать комбинацию двух ответов, упомянутых здесь, т.е.

<input type="number" />

а также

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

<input type="text" onkeypress="return isNumberKey(event);">

JavaScript

function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

    if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
    // numbers   
    key >= 48 && key <= 57 ||
    // Numeric keypad
    key >= 96 && key <= 105 ||
    // Backspace and Tab and Enter
    key == 8 || key == 9 || key == 13 ||
    // Home and End
    key == 35 || key == 36 ||
    // left and right arrows
    key == 37 || key == 39 ||
    // Del and Ins
    key == 46 || key == 45) {
        // input is VALID
    }
    else {
        // input is INVALID
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
    }
}

дополнительно вы можете добавить запятую, точку и минус (,.-)

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||

HTML

<input type="text" onkeydown="validateNumber(event);"/ >

Так просто....

// В функции JavaScript (можно использовать HTML или PHP).

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

В вашей форме введите:

<input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>

С входом макс. (Это выше позволяет 12-значный номер)

2 решения:

Использовать валидатор формы (например, с плагином валидации jQuery)

Выполните проверку во время события onblur (т.е. когда пользователь покидает поле) поля ввода с помощью регулярного выражения:

<script type="text/javascript">
function testField(field) {
    var regExpr = new RegExp("^\d*\.?\d*$");
    if (!regExpr.test(field.value)) {
      // Case of error
      field.value = "";
    }
}

</script>

<input type="text" ... onblur="testField(this);"/>

Еще один пример, где вы можете добавить только цифры в поле ввода, не буквы

<input type="text" class="form-control" id="phone" name="phone" placeholder="PHONE" spellcheck="false" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">

Вы можете использовать шаблон для этого:

<input id="numbers" pattern="[0-9.]+" type="number">

Здесь вы можете увидеть полные советы по интерфейсу мобильного сайта.

Более безопасный подход заключается в проверке значения ввода, а не в перехвате нажатий клавиш и попытке фильтрации кодов клавиш.

Таким образом, пользователь может свободно использовать стрелки на клавиатуре, клавиши-модификаторы, backspace, удалять, использовать нестандартные клавиши клавиатуры, использовать мышь для вставки, использовать перетаскивание текста и даже использовать специальные возможности ввода.

Скрипт ниже допускает положительные и отрицательные числа

1
10
100.0
100.01
-1
-1.0
-10.00
1.0.0 //not allowed

var input = document.getElementById('number');
input.onkeyup = input.onchange = enforceFloat;

//enforce that only a float can be inputed
function enforceFloat() {
  var valid = /^\-?\d+\.\d*$|^\-?[\d]*$/;
  var number = /\-\d+\.\d*|\-[\d]*|[\d]+\.[\d]*|[\d]+/;
  if (!valid.test(this.value)) {
    var n = this.value.match(number);
    this.value = n ? n[0] : '';
  }
}
<input id="number" value="-3.1415" placeholder="Type a number" autofocus>

РЕДАКТИРОВАТЬ: я удалил свой старый ответ, потому что я думаю, что он устарел сейчас.

Пожалуйста, найдите нижеупомянутое решение. В этот пользователь может войти только numeric значение, также пользователь не может быть в состоянии copy, paste, drag а также drop на входе.

Разрешенные персонажи

0,1,2,3,4,5,6,7,8,9

Не допускаются Персонажи и Персонажи через события

  • Алфавитное значение
  • Специальные символы
  • копия
  • Вставить
  • Тащить, тянуть
  • Капля

$(document).ready(function() {
  $('#number').bind("cut copy paste drag drop", function(e) {
      e.preventDefault();
  });     
});
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="form-control" name="number" id="number" onkeypress="return isNumberKey(event)" placeholder="Enter Numeric value only">

Дайте мне знать, если это не работает.

Если вы хотите предложить устройству (возможно, мобильному телефону) между алфавитным или цифровым, вы можете использовать <input type="number">,

Короткая и приятная реализация, использующая jQuery и replace() вместо того, чтобы смотреть на event.keyCode или event.which:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Единственный небольшой побочный эффект, что набранная буква появляется на мгновение и CTRL/CMD + A, кажется, ведет себя немного странно.

Просто используйте type="number", теперь этот атрибут поддерживается в большинстве браузеров

<input type="number" maxlength="3" ng-bind="first">

Код JavaScript:

function validate(evt)
{
    if(evt.keyCode!=8)
    {
        var theEvent = evt || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode(key);
        var regex = /[0-9]|\./;
        if (!regex.test(key))
        {
            theEvent.returnValue = false;

            if (theEvent.preventDefault)
                theEvent.preventDefault();
            }
        }
    }

HTML код:

<input type='text' name='price' value='0' onkeypress='validate(event)'/>

работает отлично, потому что код возврата backspace равен 8, а выражение регулярного выражения не позволяет этого, так что это простой способ обойти ошибку:)

Простой способ решить эту проблему - реализовать функцию jQuery для проверки с помощью регулярных выражений символов, напечатанных в текстовом поле, например:

Ваш HTML-код:

<input class="integerInput" type="text">

И функция JS, используя JQuery

$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});

$(function() {
        $('.integerInput').on('input', function() {
          this.value = this.value
            .replace(/[^\d]/g, '');// numbers and decimals only
            
        });
    });
<script
     src="https://code.jquery.com/jquery-2.2.4.min.js"
     integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
     crossorigin="anonymous">
</script>

<input type="text" class="integerInput"/>


  

input type="number" является атрибутом HTML5

В другом случае это поможет вам:

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

<input type="number" name="somecode" onkeypress="return isNumberKey(event)"/>

Просто другой вариант с использованием jQuery

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});

Я видел отличные ответы, но мне они нравятся как можно меньше и проще, поэтому, возможно, кто-то от этого выиграет. Я бы использовал javascript Number() а также isNaN функциональность как это:

if(isNaN(Number(str))) {
   // ... Exception it is NOT a number
} else {
   // ... Do something you have a number
}

Надеюсь это поможет.

<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

Вы также можете сравнить входное значение (которое по умолчанию рассматривается как строковое) с самим значением в виде числа, например:

if(event.target.value == event.target.value * 1) {
    // returns true if input value is numeric string
}

Тем не менее, вам нужно привязать это к событию, как keyup и т. Д.

Вот мое простое решение только для пользователей React, лучшего решения я не нашел и сделал свое. 3 шага.

Сначала создайте состояние.

      const [tagInputVal, setTagInputVal] = useState("");

Затем используйте состояние как входное значение ( value={tagInputVal}) и передать событие обработчику.

      <input id="tag-input" type="text" placeholder="Add a tag" value={tagInputVal} onChange={(e) => onChangeTagInput(e)}></input>

Затем установите значение события внутри onChange обработчик.

      function onChangeTagInput(e) {
    setTagInputVal(e.target.value.replace(/[^\d.]/ig, ""));
}

Это улучшенная функция:

function validateNumber(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
    theEvent.returnValue = false;
    if (theEvent.preventDefault) theEvent.preventDefault();
  }
}

Если у меня есть ваш вопрос, это, в основном, ответ

      <input type="number">

Мое решение для лучшего пользовательского опыта:

HTML

<input type="tel">

JQuery

$('[type=tel]').on('change', function(e) {
  $(e.target).val($(e.target).val().replace(/[^\d\.]/g, ''))
})
$('[type=tel]').on('keypress', function(e) {
  keys = ['0','1','2','3','4','5','6','7','8','9','.']
  return keys.indexOf(event.key) > -1
})

Подробности:

Прежде всего, типы ввода:

number показывает стрелки вверх / вниз, уменьшающие фактическое пространство ввода, я нахожу их уродливыми и полезными, только если число представляет количество (такие вещи, как телефоны, коды городов, идентификаторы... они не нужны)tel обеспечивает аналогичные проверки числа без стрелок

Использование [номер / телефон] также помогает отображать цифровую клавиатуру на мобильных устройствах.

Для проверки JS мне понадобились 2 функции: одна для обычного пользовательского ввода (нажатие клавиши), а другая для исправления (изменения) копирования и вставки, другие комбинации дали бы мне ужасный пользовательский опыт.

Я использую более надежный KeyboardEvent.key вместо устаревшего KeyboardEvent.charCode.

И в зависимости от поддержки вашего браузера вы можете рассмотреть возможность использования Array.prototype.includes() вместо плохо названного Array.prototype.indexOf () (для результатов true / false)

Другие вопросы по тегам