Привет всем! У меня возникла проблема с валидацией ввода в числовое поле. Хочу разрешить только цифры, одну точку и клавишу Backspace. Вот мой код:
$('input[type="number"]').on('keydown', function(event) {
const allowedChars = /^[0-9\b.]$/;
const key = String.fromCharCode(event.keyCode || event.which);
if (!allowedChars.test(key)) {
event.preventDefault();
}
if (key === '.' && this.value.includes('.')) {
event.preventDefault();
}
});
Но что-то не работает как надо. Точка все равно не вводится, хотя цифры проходят. Может, проблема в регулярке? Кто-нибудь может подсказать, где ошибка? Буду благодарен за помощь!
Попробуй использовать регулярку /+$/ для проверки ввода. А для ограничения точки можно сделать так:
if (e.key === ‘.’ && this.value.indexOf(‘.’) > -1) {
e.preventDefault();
}
Еще советую добавить проверку на Backspace отдельно:
if (e.key === ‘Backspace’) return;
Так точно будет работать. Удачи с кодом!
Проблема в том, что String.fromCharCode() не работает корректно с keyCode для спецсимволов. Лучше использовать event.key:
$('input[type="number"]').on('keydown', function(event) {
if (!/^[0-9.]$/.test(event.key) && event.key !== 'Backspace') {
event.preventDefault();
}
if (event.key === '.' && this.value.includes('.')) {
event.preventDefault();
}
});
Так будет работать и для точки, и для Backspace. Еще можно добавить проверку на максимальное количество знаков после точки, если нужно.
Хм, а я вот недавно столкнулся с похожей задачкой. В итоге решил немного по-другому подойти. Использовал input type=‘text’ вместо number, и добавил data-атрибут для максимального количества знаков после точки. Примерно так:
$(‘input[data-decimal-places]’).on(‘input’, function() {
let value = this.value.replace(/[^0-9.]/g, ‘’);
const parts = value.split(‘.’);
if (parts[1]) parts[1] = parts[1].slice(0, this.dataset.decimalPlaces);
this.value = parts.join(‘.’);
});
Может, кому-то такой подход тоже пригодится. Главное - не забыть проверить значение на стороне сервера, мало ли что)