Поддержка множественных вариантов маски в Inputmask реализует механизм, при котором одно поле ввода может принимать несколько форматов данных одновременно. Это необходимо в случаях, когда структура вводимых значений не фиксирована: различная длина номера телефона, альтернативные форматы идентификаторов, региональные различия в записи дат или документов.
Основная задача механизма — обеспечить согласованное поведение маски при наличии нескольких допустимых шаблонов, не разрушая валидацию и не создавая неоднозначностей в процессе ввода.
|Наиболее компактный способ задания нескольких вариантов маски основан на использовании оператора альтернатив внутри строки маски.
Inputmask({
mask: "(999|9999)-9999"
}).mask(input);
В данном случае определены два допустимых варианта первой части:
999-99999999-9999Механизм альтернатив работает на уровне сегментов: Inputmask анализирует возможные ветки и пытается определить подходящую в момент ввода.
Особенность такого подхода заключается в том, что каждая ветка должна быть структурно совместима с остальной частью маски. Различия допустимы только в пределах альтернативного блока.
keepStaticКлючевой параметр, влияющий на обработку множественных масок, —
keepStatic.
Inputmask({
mask: "(99|999)-9999",
keepStatic: true
}).mask(input);
keepStatic: trueПри включённом режиме библиотека стремится зафиксировать один наиболее подходящий вариант и не пересчитывать структуру маски при каждом вводе символа. Это приводит к более стабильному поведению курсора и снижает вероятность «перескоков» между вариантами.
Поведение становится предсказуемым:
keepStatic: falseПри отключённом режиме Inputmask динамически пересчитывает возможные варианты на каждом шаге ввода.
Это приводит к:
Альтернативный подход заключается в передаче массива масок вместо одной строки.
Inputmask({
mask: ["999-9999", "9999-9999", "+9 (999) 999-9999"]
}).mask(input);
В этом режиме каждая маска рассматривается как независимый кандидат. Inputmask выбирает подходящий шаблон в зависимости от вводимых символов.
Особенности поведения:
Этот подход часто используется для поддержки разных региональных форматов телефонов или документов.
При наличии нескольких вариантов Inputmask использует эвристический механизм:
Если несколько вариантов остаются допустимыми, вступает в действие
keepStatic, который фиксирует текущий выбор или продолжает
динамическое переключение.
Более сложный уровень управления множественными вариантами реализуется через функцию, возвращающую маску.
Inputmask({
mask: function () {
return /\\d/.test(this.value) && this.value.length > 10
? "+9 (999) 999-9999"
: "999-9999";
}
}).mask(input);
Такая конструкция позволяет:
Функциональная маска фактически выводит систему за пределы статических шаблонов, превращая её в условный генератор формата.
Варианты масок могут включать повторяющиеся конструкции:
Inputmask({
mask: "+9{1,3} (999|9999) 999-9999"
}).mask(input);
Здесь совмещаются:
9{1,3}(999|9999)Подобные комбинации увеличивают гибкость, но усложняют анализ структуры. При неправильном проектировании маски возможны конфликты между повторениями и альтернативами.
Регулярные выражения в Inputmask также могут выступать способом задания множественных форматов.
Inputmask({
regex: "(\\d{3}-\\d{2}-\\d{4}|\\d{2}-\\d{7})"
}).mask(input);
В этом случае:
XXX-XX-XXXX;XX-XXXXXXX.Регулярное выражение полностью берет на себя задачу определения структуры, а Inputmask выполняет только сопоставление и управление вводом.
При наличии альтернативных вариантов позиционирование курсора становится сложнее. Основные проблемы возникают при:
Механизм caret корректируется на основе текущего выбранного варианта маски, что может приводить к перерасчёту позиции при каждом изменении структуры.
Рост числа альтернатив напрямую влияет на производительность:
input событии.Особенно заметно это при использовании:
(a|b|c|d|...);Inputmask({
mask: [
"+7 (999) 999-99-99",
"+1 (999) 999-9999",
"+44 9999 999999"
]
}).mask(input);
Inputmask({
mask: ["999-99-9999", "9999-9999-9999"]
}).mask(input);
Inputmask({
mask: "(AA|999)-9999"
}).mask(input);
Если несколько масок частично совпадают, выбор становится неоднозначным:
999-99999999-999Такие конфигурации приводят к нестабильному переключению.
Использование большого количества вариантов без приоритетов усложняет предсказуемость поведения.
Разные длины масок могут вызывать скачки курсора при переключении между вариантами.
Для повышения устойчивости множественных масок применяются следующие подходы:
keepStatic для фиксации выбора;Механизм множественных вариантов в Inputmask строится на трёх базовых подходах:
Совместное использование этих механизмов позволяет строить сложные системы ввода, поддерживающие разнообразные форматы данных при сохранении контроля над валидацией и структурой ввода.