Сначала я попытался решить эту проблему с помощью 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)
Некоторые вещи, которые могут вас заинтересовать:
- Допускается только одна десятичная точка
- Разрешить знак минус можно только в том случае, если он расположен в начале строки. Это позволило бы для отрицательных чисел.
Упущения
- Положение каретки не доступно внутри функции. Это значительно уменьшило контекстные ограничения, которые вы можете реализовать (например, нет двух одинаковых последовательных символов). Не уверен, что лучший способ получить к нему доступ.
Я знаю, что заголовок запрашивает решения jQuery, но, надеюсь, кто-то найдет это полезным в любом случае.