jQuery: каков наилучший способ ограничить «числовой» ввод только для текстовых полей? (разрешить десятичные точки) - PullRequest
225 голосов
/ 21 мая 2009

Каков наилучший способ ограничить ввод «только для чисел» для текстовых полей?

Я ищу что-то, что допускает десятичные точки.

Я вижу много примеров. Но еще предстоит решить, какой из них использовать.

Обновление от Правина Джеганатана

Плагинов больше нет, jQuery реализовал собственный jQuery.isNumeric(), добавленный в v1.7. Смотри: https://stackoverflow.com/a/20186188/66767

Ответы [ 40 ]

9 голосов
/ 16 мая 2013

Вы не видите магическое появление и исчезновение алфавитов при нажатии клавиши вниз. Это работает и на мышиную пасту.

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});
8 голосов
/ 05 мая 2014

Сначала я попытался решить эту проблему с помощью jQuery, но меня не порадовали нежелательные символы (не цифры), которые на самом деле появляются в поле ввода перед удалением из keyup.

В поисках других решений я нашел это:

Целые числа (неотрицательные)

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {
    return oKeyEvent.charCode === 0 ||
        /\d/.test(String.fromCharCode(oKeyEvent.charCode));
  }
</script>

<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput" 
    onkeypress="return numbersOnly(this, event);" 
    onpaste="return false;" /></p>
</form>

Источник: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example Живой пример: http://jsfiddle.net/u8sZq/

Десятичные точки (неотрицательные)

Чтобы разрешить одну десятичную точку, вы можете сделать что-то вроде этого:

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {        
    var s = String.fromCharCode(oKeyEvent.charCode);
    var containsDecimalPoint = /\./.test(oToCheckField.value);
    return oKeyEvent.charCode === 0 || /\d/.test(s) || 
        /\./.test(s) && !containsDecimalPoint;
  }
</script>

Источник: Только что написал это. Кажется, работает. Живой пример: http://jsfiddle.net/tjBsF/

Другие настройки

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

Некоторые вещи, которые могут вас заинтересовать:

  • Допускается только одна десятичная точка
  • Разрешить знак минус только в том случае, если он расположен в начале строки. Это позволило бы получить отрицательные числа.

1037 * Недостатки * Положение каретки недоступно внутри функции. Это значительно уменьшило контекстные ограничения, которые вы можете реализовать (например, нет двух одинаковых последовательных символов). Не уверен, что лучший способ получить к нему доступ. Я знаю, что заголовок запрашивает решения jQuery, но, надеюсь, кто-нибудь найдет это полезным в любом случае.

6 голосов
/ 25 февраля 2014
   window.jQuery.fn.ForceNumericOnly =
       function () {

           return this.each(function () {
               $(this).keydown(function (event) {
                   // Allow: backspace, delete, tab, escape, and enter
                   if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                       // Allow: Ctrl+A
                       (event.keyCode == 65 && event.ctrlKey === true) ||
                       // Allow: home, end, left, right
                       (event.keyCode >= 35 && event.keyCode <= 39)) {
                       // let it happen, don't do anything
                       return;
                   } else {
                       // Ensure that it is a number and stop the keypress
                       if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                           event.preventDefault();
                       }
                   }
               });
           });
       };

И примените это ко всем входам, которые вы хотите:

$('selector').ForceNumericOnly();
6 голосов
/ 05 августа 2011

Спасибо за пост Дэйва Аарона Смита

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

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section 
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      (96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});
5 голосов
/ 06 октября 2015

HTML5 поддерживает номер типа ввода с глобальной поддержкой браузеров 88% + в соответствии с CanIUse по состоянию на октябрь 2015 года.

<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />

Это не решение, связанное с JQuery, но преимущество в том, что на мобильных телефонах клавиатура Android будет оптимизирована для ввода цифр.

В качестве альтернативы, можно использовать тип ввода текста с новым параметром «pattern». Подробнее в спецификации HTML5.

Я думаю, что это лучше, чем решение jquery, поскольку в данном вопросе решение jquery не поддерживает разделитель тысяч. Если вы можете использовать html5.

JSFiddle: https://jsfiddle.net/p1ue8qxj/

4 голосов
/ 18 июня 2012

/ * это моя кросс-браузерная версия Как разрешить ввод только HTML (0-9) в поле ввода HTML с помощью jQuery?
* /

$("#inputPrice").keydown(function(e){
    var keyPressed;
    if (!e) var e = window.event;
    if (e.keyCode) keyPressed = e.keyCode;
    else if (e.which) keyPressed = e.which;
    var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
    if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
             // Allow: Ctrl+A
            (keyPressed == 65 && e.ctrlKey === true) ||
             // Allow: home, end, left, right
            (keyPressed >= 35 && keyPressed <= 39)) {
                 // let it happen, don't do anything
                 return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
                e.preventDefault();
            }
        }

  });
4 голосов
/ 18 января 2012

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

$field.keyup(function(){
    var val = $j(this).val();
    if(isNaN(val)){
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) val =val.replace(/\.+$/,"");
    }
    $j(this).val(val); 
});
  • показать визуальную обратную связь (перед исчезновением появляется неправильная буква)
  • допускает десятичные дроби
  • ловит несколько "."
  • не имеет проблем с левым / правым делом и т. Д.
3 голосов
/ 08 февраля 2012

Вы можете использовать autoNumeric с decorplanit.com . У них есть хорошая поддержка числовых, а также валюты, округления и т. Д.

Я использовал в среде IE6, с несколькими изменениями CSS, и это был разумный успех.

Например, можно определить класс css numericInput, и его можно использовать для украшения ваших полей масками числового ввода.

адаптировано с сайта autoNumeric:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!
3 голосов
/ 18 декабря 2014

Я думаю, что это хороший способ решения этой проблемы, и он чрезвычайно прост:

$(function() {
    var pastValue, pastSelectionStart, pastSelectionEnd;

    $("input").on("keydown", function() {
        pastValue          = this.value;
        pastSelectionStart = this.selectionStart;
        pastSelectionEnd   = this.selectionEnd;
    }).on("input propertychange", function() {
        var regex = /^[0-9]+\.?[0-9]*$/;

        if (this.value.length > 0 && !regex.test(this.value)) {
            this.value          = pastValue;
            this.selectionStart = pastSelectionStart;
            this.selectionEnd   = pastSelectionEnd;
        }
    });
});

Пример: JSFiddle

Сценарии покрыты

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

  1. Допускается только 1 десятичная точка.
  2. Позволяет home, end и клавиши arrow.
  3. Позволяет использовать delete и backspace для любого индекса.
  4. Позволяет редактировать по любому индексу (при условии, что ввод соответствует регулярному выражению).
  5. Позволяет Ctrl + V и Shift + Вставка для правильного ввода (то же самое с правой кнопкой мыши + вставить).
  6. Не мерцает текстовое значение, потому что событие keyup не используется.
  7. Восстанавливает выбор после неверного ввода.

Сценарии не выполнены

  • Начиная с 0.5 и удаляя только ноль, работать не будет. Это можно исправить, изменив регулярное выражение на /^[0-9]*\.?[0-9]*$/, а затем добавив событие размытия, чтобы добавить 0, когда текстовое поле начинается с десятичной точки (при желании). Посмотрите этот расширенный сценарий , чтобы лучше понять, как это исправить.

Plugin

Я создал этот простой плагин jquery , чтобы сделать это проще:

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);
3 голосов
/ 21 мая 2009

Просто запустите содержимое через parseFloat (). Он вернет NaN при неверном вводе.

...