Ограничение диапазона значений в Inputmask реализуется через механизм пост-валидации и нормализации вводимых данных. В отличие от простых масок формата (телефон, дата, код), числовые маски оперируют не только структурой строки, но и её семантическим значением как числа.
Основная идея заключается в том, что вводимое значение рассматривается как числовой диапазон, внутри которого допустимы только значения, удовлетворяющие заданным границам. Любая попытка выйти за пределы диапазона либо блокируется на уровне ввода, либо корректируется при финализации значения.
Ключевыми сущностями выступают:
Механизм диапазонов в Inputmask чаще всего используется совместно с числовыми алиасами:
numericintegerdecimalКаждый из этих алиасов поддерживает интерпретацию значения как числа, а значит может участвовать в проверке диапазона.
Пример базовой конфигурации:
Inputmask({
alias: "numeric",
min: 10,
max: 100
}).mask(input);
В данной конфигурации маска ограничивает ввод значений диапазоном от 10 до 100. При этом контроль осуществляется не только после завершения ввода, но и в процессе набора.
Параметры min и max являются основными
инструментами ограничения диапазона.
Определяет минимально допустимое значение. Любое число меньше этого порога считается недопустимым при финальной проверке.
Определяет максимально допустимое значение. Любое число выше этого порога либо корректируется, либо блокируется в зависимости от контекста ввода.
Поведение Inputmask не всегда заключается в жестком запрете символов. В некоторых случаях библиотека допускает временно некорректные состояния, если пользователь ещё не завершил ввод.
Пример:
Inputmask({
alias: "integer",
min: 0,
max: 999
}).mask(input);
Здесь допустимы значения от 0 до 999, включая промежуточные состояния вроде пустой строки или частично введённого числа.
Контроль диапазона в Inputmask не является мгновенным запретом каждого символа. Вместо этого применяется стратегия постепенной валидации:
Особенность заключается в том, что библиотека старается сохранить UX-поведение максимально естественным. Например, при вводе верхней границы диапазона возможны временные состояния, которые ещё не валидны как число, но потенциально могут привести к валидному результату.
При использовании decimal алиаса диапазоны работают
совместно с параметром digits, который определяет точность
дробной части.
Inputmask({
alias: "decimal",
min: 0.5,
max: 10.75,
digits: 2,
radixPoint: "."
}).mask(input);
В этом случае контроль диапазона усложняется из-за необходимости учитывать:
Во время ввода Inputmask допускает частично сформированные числа, но при потере фокуса или завершении ввода выполняется строгая проверка границ.
Если итоговое значение выходит за пределы допустимого диапазона, возможны три стратегии обработки:
min или
max)Выбор стратегии зависит от конфигурации алиаса и дополнительных параметров поведения маски.
Пример корректировки:
Inputmask({
alias: "numeric",
min: 100,
max: 500,
autoUnmask: true
}).mask(input);
При вводе значения 600 система может автоматически
привести его к 500.
Механизм диапазонов тесно связан с хуками валидации:
preValidation — проверка до применения символаpostValidation — проверка после формирования
значенияДиапазонная логика чаще всего реализуется на этапе
postValidation, поскольку для корректного сравнения
необходимо собрать полное числовое значение.
Пример кастомной логики:
Inputmask({
alias: "numeric",
min: 0,
max: 100,
postValidation: function (buffer, opts, currentResult) {
const value = parseFloat(buffer.join(""));
if (value > opts.max) return false;
if (value < opts.min) return false;
return currentResult;
}
}).mask(input);
Функция isValid учитывает диапазонные ограничения как
часть общей проверки маски.
При вызове:
const mask = Inputmask({
alias: "integer",
min: 1,
max: 10
});
mask.mask(input);
mask.isValid("15");
результат будет отрицательным, поскольку значение выходит за пределы допустимого интервала.
При этом важно учитывать, что isValid оценивает уже
сформированное значение, а не промежуточные состояния ввода.
Одной из сложностей реализации диапазонного контроля является обработка незавершённых чисел. Например:
Inputmask в таких случаях использует гибкую модель допустимых промежуточных состояний, где значение может временно не удовлетворять диапазону, но не считается окончательно невалидным.
Это необходимо для обеспечения возможности ввода корректного числа по мере его формирования.
При использовании числовых алиасов совместно с форматированием валюты добавляются дополнительные уровни сложности:
Inputmask({
alias: "currency",
prefix: "$ ",
groupSeparator: ",",
digits: 2,
min: 10,
max: 10000
}).mask(input);
Здесь диапазон применяется к числовой части, игнорируя визуальные элементы форматирования:
Фактическая проверка выполняется на «чистом» числе без форматирования.
Диапазонные ограничения часто комбинируются с другими правилами:
Пример комплексной конфигурации:
Inputmask({
alias: "integer",
min: 100,
max: 999,
allowMinus: false,
placeholder: "0"
}).mask(input);
В этом случае диапазон становится частью более строгой системы ограничений, где каждое правило влияет на возможные состояния ввода.
При установке значения программно через API маски диапазонная проверка также применяется:
const im = Inputmask({
alias: "numeric",
min: 5,
max: 50
}).mask(input);
input.value = "100";
im.setValue(input, "100");
В таких случаях Inputmask не просто записывает значение, а прогоняет его через полный цикл валидации и нормализации.