TL; DR
Для значений, вводимых символ за символом, попробуйте следующее:
$('#duration').on('input', function() {
this.value = this.value.match(/^\d+\:?[0-5]?[0-9]?/);
});
Фон
Этот тип настройки будет сильно зависеть от того, какой тип ввода что ожидается, и как вводится входное значение. Т.е., если он вводится, вставляется целиком или вставляется функцией.
Ваше текущее решение основывается на том факте, что мы можем сразу же присвоить результат функции match()
в качестве значения поля ввода.
Функция String.prototype.match () вернет следующее:
An Array
, содержимое которого зависит от наличия или отсутствия глобального (g) флаг или null
, если совпадений не найдено.
Рассмотрим ввод "42:100"
const result = '42:100'.match(/^\d+\:?\d{0,2}/);
match()
и возвращает:
["42:10", index: 0, input: "42:100", groups: undefined]
, который мы немедленно назначаем обратно в поле ввода. Он решит отобразить первый элемент в этом массиве, то есть "42:10"
.
Если match()
не найдет соответствующий шаблон, он вернет null
и поле ввода станет пустым.
Возможное решение
Итак, с этой информацией мы теперь знаем, что если человек печатает значение по одному символу за раз , важно, чтобы регулярное выражение всегда могло соответствовать ожидаемому шаблон , для каждого допустимого входного значения, так что оно, в свою очередь, может быть назначено обратно в поле ввода.
Исходное регулярное выражение, которое я понимаю, вы хотите разрешить для любого числа длины, которое может быть за ним следует двоеточие, а затем значение двух di git, которое напоминает секунды (т. е. допускается 0 - 59).
Ключом здесь является также сделать последние две цифры необязательными, используя оператор квантификатора ?
.
Таким образом, одним из возможных решений было бы включение необязательных цифр после двоеточия, ограничивая их значениями 0 - 59, например:
$('#duration').on('input', function() {
this.value = this.value.match(/^\d+\:?[0-5]?[0-9]?/);
});
Но, опять же, все сводится к тому, какой род d значений, которые ожидаются и могут быть введены в поле ввода.