Механизм валидации в Inputmask строится вокруг идеи синхронизации пользовательского ввода с заранее определённой маской, где каждое изменение состояния поля немедленно проверяется на соответствие правилам. В отличие от классических схем, где валидация выполняется постфактум (например, при отправке формы), здесь проверка является непрерывным процессом, встроенным в поток ввода.
В основе лежит анализ каждого символа относительно позиции в маске, а также проверка допустимости переходов между состояниями. Маска выступает как формальный грамматический шаблон, а ввод пользователя — как поток токенов, который должен быть корректно сопоставлен этой грамматике.
Каждый символ, введённый пользователем, проходит несколько уровней проверки:
1. Проверка по маске символов Каждая позиция маски задаёт допустимый тип символа:
9 — цифраa — буква* — буквенно-цифровой символ-, /,
(, ))Ввод сравнивается с ожидаемым типом. Если символ не соответствует, он отклоняется или перенаправляется в следующую допустимую позицию (в зависимости от конфигурации).
2. Проверка позиции (position validation) Валидация учитывает не только сам символ, но и контекст его положения. Например, цифра может быть корректной по типу, но недопустимой в текущей позиции, если она нарушает структуру маски.
3. Проверка полного заполнения Поле считается валидным только в случае, если все обязательные позиции маски заполнены корректными символами.
Метод isValid() является центральной точкой проверки
значения вне контекста ввода. Он используется для оценки строки
целиком.
Алгоритм работы включает следующие этапы:
Особое внимание уделяется параметру greedy-маски, который влияет на строгость проверки.
Greedy-режим определяет, насколько строго Inputmask требует полного соответствия маске.
При включённом greedy:
isComplete строго привязан к полной длине маскиПри выключенном greedy:
Это особенно важно в формах с динамическими или необязательными полями.
Inputmask использует внутреннюю трансляцию маски в регулярное выражение. Это позволяет проводить финальную проверку строки как единого объекта.
Процесс включает:
^ и
$)Таким образом, итоговая проверка часто сводится к:
С точки зрения теории автоматов, Inputmask можно представить как конечный автомат, где:
9, a,
*, regex-паттерны)Каждый ввод символа вызывает переход автомата. Если переход невозможен, ввод блокируется или перенаправляется.
Такой подход объясняет высокую предсказуемость поведения Inputmask при сложных масках.
Динамические маски изменяют структуру в процессе ввода. В этом случае валидация становится двухуровневой:
Например, при маске с условными блоками:
Это требует пересчёта допустимых позиций после каждого изменения ввода.
При вставке строки Inputmask не проверяет символы по одному, а анализирует всю вставку как единый фрагмент.
Алгоритм:
Дополнительно применяются хук-функции, такие как
onBeforePaste, позволяющие модифицировать строку до начала
проверки.
Inputmask предоставляет несколько точек вмешательства в процесс проверки:
Позволяет изменить входное значение до запуска основной валидации. Используется для:
Работает с буфером обмена до вставки. Часто применяется для:
Срабатывает после завершения проверки текущего состояния. Позволяет:
Маски могут содержать необязательные части, обозначаемые специальными
конструкциями ([], {} или альтернативными
паттернами).
В таких случаях валидация учитывает:
Это приводит к появлению нескольких допустимых валидных состояний одной и той же маски.
Система различает два состояния:
Поле может быть:
Проверка завершённости особенно важна для форм с обязательной отправкой.
Одной из ключевых особенностей является инкрементальная валидация. Вместо полной проверки строки после каждого изменения используется:
Это снижает вычислительную нагрузку и делает Inputmask пригодным для высокочастотного ввода.
Ошибки валидации не выражаются как исключения. Вместо этого система использует мягкие механизмы:
Такой подход позволяет избежать прерывания потока ввода.
Внутри Inputmask поддерживается два представления:
Валидация может выполняться как на одном уровне, так и на обоих. Например:
Это особенно важно для финансовых, телефонных и идентификационных форматов.
Если несколько правил маски конфликтуют (например, пересекающиеся регулярные выражения), применяется приоритет:
9, a)Конфликты не приводят к ошибке выполнения, но могут ограничивать допустимые вводы.
Некоторые маски требуют учёта контекста предыдущих символов. Например:
В таких случаях валидация становится контекстно-зависимой и не может быть сведена к простому regex.
В обобщённом виде процесс проверки в Inputmask можно представить как последовательность:
Такой многоуровневый подход обеспечивает устойчивость системы к нестандартному вводу и делает возможной работу сложных масок без потери интерактивности.