jQuery: каков наилучший способ ограничить ввод "числа"только для текстовых полей? (разрешить десятичные точки)

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

Я ищу что-то, что позволяет десятичной точки.

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

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

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

30 ответов


я успешно реализовал многие формы с jquery.numeric плагин.

$(document).ready(function(){
    $(".numeric").numeric();
});

кроме того, это работает с textareas также!

EDIT: - с более широкой поддержкой новых стандартов HTML мы можем использовать pattern атрибут и number тип input элементы для ограничения ввода только числа. Он также работает для ограничения вставки нечислового содержимого. Более подробная информация о number и другие новые типы ввода данных здесь.


Если вы хотите ограничить ввод (в отличие от проверки), вы можете работать с ключевыми событиями. что-то вроде этого:--3-->

<input type="text" class="numbersOnly" value="" />

и:

jQuery('.numbersOnly').keyup(function () { 
    this.value = this.value.replace(/[^0-9\.]/g,'');
});

это сразу дает пользователю знать, что они не могут вводить Альфа-символы и т. д. а не позже на этапе проверки.

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


Я думал, что лучший ответ был выше всего этого.

jQuery('.numbersOnly').keyup(function () {  
    this.value = this.value.replace(/[^0-9\.]/g,''); 
});

но я согласен, что это немного больно, что клавиши со стрелками и кнопка удаления привязывают курсор к концу строки (и из-за этого он был возвращен мне в тестировании)

я добавил в простое изменение

$('.numbersOnly').keyup(function () {
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
       this.value = this.value.replace(/[^0-9\.]/g, '');
    }
});

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


jquery.числовой плагин имеет некоторые ошибки, о которых я уведомил автора. Это позволяет несколько десятичных точек в Safari и Opera, и вы не можете ввести backspace, клавиши со стрелками или несколько других символов управления в Opera. Мне нужен был положительный целочисленный ввод, поэтому в конце концов я просто написал свой собственный.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // 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
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

больше никаких плагинов, jQuery реализовал свой собственный С помощью jQuery.isNumeric () добавлено в v1.7.

jQuery.isNumeric( value )

определяет, является ли его аргумент номер.

результаты пробы

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric({});          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

вот пример того, как связать isNumeric() с прослушивателем событий

$(document).on('keyup', '.numeric-only', function(event) {
   var v = this.value;
   if($.isNumeric(v) === false) {
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   }
});

плагин numeric (), упомянутый выше, не работает в Opera (вы не можете вернуться, удалить или даже использовать клавиши Назад или вперед).

код ниже в JQuery или Javascript будет работать отлично (и это только две строки).

JQuery:

$(document).ready(function() {
    $('.key-numeric').keypress(function(e) {
            var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
            if (verified) {e.preventDefault();}
    });
});

Javascript:

function isNumeric(e)
{
    var keynum = (!window.event) ? e.which : e.keyCode;
    return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}

конечно, это для чистого числового ввода (плюс backspace, delete, forward/back keys) , но его можно легко изменить, чтобы включить точки и минус письмена.


можно использовать плагин проверки С количество() метод.

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true
    }
  }
});

нет необходимости в длинном коде для ограничения ввода номера просто попробуйте этот код.

он также принимает допустимые значения int & float.

Javascript Подход

onload =function(){ 
  var ele = document.querySelectorAll('.number-only')[0];
  ele.onkeypress = function(e) {
     if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
        return false;
  }
  ele.onpaste = function(e){
     e.preventDefault();
  }
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

подход jQuery

$(function(){

  $('.number-only').keypress(function(e) {
	if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
  })
  .on("cut copy paste",function(e){
	e.preventDefault();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

обновление

приведенные выше ответы для наиболее распространенных случаев использования-проверка ввода в виде числа.

но ниже приведен фрагмент кода для особых случаев использовать

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

$(function(){
      
  $('.number-only').keyup(function(e) {
        if(this.value!='-')
          while(isNaN(this.value))
            this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
                                   .split('').reverse().join('');
    })
    .on("cut copy paste",function(e){
    	e.preventDefault();
    });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

ниже то, что я использую, чтобы буквально блокировать нажатия клавиш. Это позволяет только цифры 0-9 и десятичную точку. Легко реализовать, не много кода, и работает как шарм:

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

<input value="" onkeypress="return isNumberKey(event)">

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

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true,
      digits: true,
      range : [0, 50]
    }
  }
});

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

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Я сначала попытался решить это с помощью 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/

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

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

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

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

недостатки

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

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


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

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

$(".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();
  }
});

   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();

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/


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

$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); 
});
  • показать визуальную обратную связь (неправильная буква появляется перед исчезновением)
  • позволяет десятичные
  • ловит несколько "."
  • не имеет проблем с левым / правым del и т. д.

/* это моя кросс-браузерная версия Как разрешить только числовой (0-9) в HTML inputbox с помощью 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();
            }
        }

  });

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

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

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

адаптировано из autoNumeric веб-сайта:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!

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

$(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 + insert для допустимого ввода (то же самое с правой кнопкой мыши + вставить).
  6. не мерцает текстовое значение, потому что keyup событие не используется.
  7. восстанавливает выделение после неверного ввода.

сценарии не удалось

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

плагин

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

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);

лучший способ проверить контакты из текстового поля, когда оно теряет фокус.

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

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


проверьте этот код поиска для использования базы данных:

function numonly(root){
    >>var reet = root.value;
    var arr1 = reet.length;
    var ruut = reet.charAt(arr1-1);
    >>>if (reet.length > 0){
        var regex = /[0-9]|\./;
        if (!ruut.match(regex)){
            var reet = reet.slice(0, -1);
            $(root).val(reet);
        >>>>}
    }
}
//Then use the even handler onkeyup='numonly(this)'

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


Это фрагмент, который я только что сделал (используя часть кода Питера Мортенсена / Кейта Бентрупа) для целочисленной процентной проверки в текстовом поле (требуется jQuery):

/* This validates that the value of the text box corresponds
 * to a percentage expressed as an integer between 1 and 100,
 * otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
    if (!isNaN(parseInt(this.value,10))) {
        this.value = parseInt(this.value);
    } else {
        this.value = 0;
    }
    this.value = this.value.replace(/[^0-9]/g, '');
    if (parseInt(this.value,10) > 100) {
        this.value = 100;
        return;
    }
});

этот код:

  • позволяет использовать основные цифровые клавиши и цифровую клавиатуру.
  • проверяет, чтобы исключить Shift-числовые символы (например,#,$, % и т. д.)
  • заменяет значения NaN на 0
  • заменяет на 100 значений выше 100

Я надеюсь, что это помогает нуждающимся.


нашел отличное решение здесь http://ajax911.com/numbers-numeric-field-jquery/

Я просто изменил "keyup" на "keydown" в соответствии с моим требованием


Если вы используете HTML5, вам не нужно прилагать больших усилий для выполнения проверки. Просто используйте -

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

атрибут step позволяет использовать десятичную точку.


другой способ сохранить позицию курсора на входе:

$(document).ready(function() {
  $('.numbersOnly').on('input', function() {
    var position = this.selectionStart - 1;

    fixed = this.value.replace(/[^0-9\.]/g, '');  //remove all but number and .
    if(fixed.charAt(0) === '.')                  //can't start with .
      fixed = fixed.slice(1);

    var pos = fixed.indexOf(".") + 1;
    if(pos >= 0)
      fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', '');  //avoid more than one .

    if (this.value !== fixed) {
      this.value = fixed;
      this.selectionStart = position;
      this.selectionEnd = position;
    }
  });
});

плюсы:

  1. пользователь может использовать клавиши со стрелками, Backspace, Delete, ...
  2. работает, когда вы хотите вставить цифры

Plunker: демо работающего


Я только что нашел еще лучший плагин. Дает вам гораздо больше контроля. Скажем, у вас есть дата рождения поле, где вам нужно, чтобы оно было числовым, но также принимает символы " / "или" -".

Он отлично работает!

проверьте это в http://itgroup.com.ph/alphanumeric/.


    $(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // 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
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

этот код работал на мне довольно хорошо, мне просто нужно было добавить 46 в массив controlKeys, чтобы использовать период, хотя я не думаю, что это лучший способ сделать это;)


я использовал это,с хорошими результатами..

ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
    var charcode = (e.which) ? e.which : e.keyCode;
    // for decimal point
    if(!(charcode===190 || charcode===110))
    {           // for numeric keys andcontrol keys
        if (!((charcode>=33 && charcode<=57) || 
        // for numpad numeric keys
        (charcode>=96 && charcode<=105) 
        // for backspace
        || charcode==8)) 
        {
            alert("Sorry! Only numeric values allowed.");
            $("#id").val(ini);
        }
        // to include decimal point if first one has been deleted.
        if(charcode===8)
        {
            ini=ini.split("").reverse();
            if(ini[0]==".")
            a=0;                 
        }
    }
    else
    {
        if(a==1)
        {
            alert("Sorry! Second decimal point not allowed.");
            $("#id").val(ini);
        }
        a=1;
    }
    ini=$("#id").val();
});


find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

Это очень просто, что у нас уже есть встроенная функция javascript "isNaN" есть.

$("#numeric").keydown(function(e){
  if (isNaN(String.fromCharCode(e.which))){ 
    return false; 
  }
});