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 .
Более сложные параметры проверки
Если вы хотите выполнить некоторые другие проверки и проверки, это может быть полезно: