Динамические маски в контексте Inputmask представляют собой механизм, при котором шаблон ввода изменяется в зависимости от состояния вводимого значения. В отличие от фиксированных масок, где структура ввода заранее определена и не меняется, динамический подход позволяет адаптировать формат поля в реальном времени.
Ключевая особенность динамических масок заключается в том, что система перестраивает правила ввода по мере набора символов. Это может выражаться в смене шаблона, переключении между несколькими масками или изменении поведения отдельных символов.
Основные сценарии применения:
Статическая маска задаёт фиксированную структуру:
Inputmask("9999-9999").mask(input);
Здесь пользователь всегда вводит строго восемь цифр, разделённых дефисом. Любое отклонение от структуры блокируется.
Динамическая маска, напротив, допускает изменение структуры:
Inputmask({
mask: ["999-999", "99-99-99"]
}).mask(input);
В этом случае библиотека выбирает подходящий шаблон в зависимости от введённых данных.
Разница проявляется в нескольких аспектах:
Когда используется массив масок, Inputmask оценивает ввод пользователя и сопоставляет его с наиболее подходящим шаблоном. Алгоритм основан на последовательной проверке соответствия символов:
Пример:
Inputmask({
mask: ["(999) 999-9999", "+9 (999) 999-9999"]
}).mask(input);
Здесь возможны два формата номера: локальный и международный. Выбор происходит автоматически в зависимости от начального ввода.
Одним из наиболее гибких способов реализации динамического поведения является использование функции, возвращающей маску.
Inputmask({
mask: function () {
return "9999-9999";
}
}).mask(input);
Однако истинная ценность этого подхода проявляется при условной логике:
Inputmask({
mask: function (value) {
return value.startsWith("+") ? "+9 999 999 9999" : "999-999-999";
}
}).mask(input);
Здесь маска зависит от текущего значения поля.
Особенности функциональной маски:
Один из распространённых сценариев — переключение формата в зависимости от длины или префикса.
Inputmask({
mask: function (value) {
const digits = value.replace(/\D/g, "");
if (digits.length <= 3) return "999";
if (digits.length <= 6) return "999-999";
return "999-999-999";
}
}).mask(input);
Такой подход позволяет постепенно усложнять формат по мере ввода.
Характерные особенности:
Inputmask поддерживает массив масок как основной инструмент динамического выбора.
Inputmask({
mask: [
"99 99 99",
"9999 9999",
"999 999 999"
]
}).mask(input);
Каждый шаблон представляет собой альтернативный формат.
Механизм работы:
Использование массива особенно эффективно для:
Помимо массива, Inputmask поддерживает альтернативные ветвления внутри одного шаблона:
Inputmask("999[-999]").mask(input);
Символы в квадратных скобках обозначают необязательную часть.
Также применяется синтаксис альтернатив:
Inputmask("999|9999").mask(input);
Здесь используется логика выбора одного из вариантов.
Особенности:
Динамические маски тесно связаны с обработкой неполных данных. Inputmask активно использует промежуточные состояния ввода:
Пример:
Inputmask({
mask: ["99-99", "9999-99"]
}).mask(input);
При вводе первых символов система может временно удерживать несколько вариантов до тех пор, пока не станет возможен однозначный выбор.
Механизм JIT (Just-In-Time) влияет на то, как маска визуализируется в процессе ввода.
Inputmask({
mask: "999-999-9999",
jitMasking: true
}).mask(input);
При включении:
Связь с динамическими масками проявляется в том, что отображение шаблона становится адаптивным.
Динамическое поведение усиливается через кастомные определения:
Inputmask.extendDefinitions({
"#": {
validator: "[0-9]",
cardinality: 1,
definitionSymbol: "#"
}
});
После этого можно использовать расширенный символ:
Inputmask({
mask: "####-####"
}).mask(input);
Это позволяет:
Перед применением маски Inputmask может изменять входные данные.
Inputmask({
mask: "999-999",
onBeforeMask: function (value) {
return value.replace(/\s/g, "");
}
}).mask(input);
Это важно для динамических сценариев, где:
В продвинутых реализациях динамические маски комбинируются с несколькими механизмами:
Пример комбинированного подхода:
Inputmask({
mask: function (value) {
const digits = value.replace(/\D/g, "");
if (digits.startsWith("8")) {
return "8 (999) 999-99-99";
}
if (digits.startsWith("7")) {
return "+7 (999) 999-99-99";
}
return "9999999999";
},
jitMasking: true
}).mask(input);
Такой подход позволяет реализовать:
При построении динамических схем важно учитывать поведение библиотеки в реальном времени.
Ключевые аспекты:
Типичные проблемы:
Динамические маски особенно чувствительны к операциям удаления:
Пример проблемного сценария:
Такие ситуации требуют стабильной логики выбора маски.
Для повышения предсказуемости применяются ограничения:
Пример:
Inputmask({
mask: function (value) {
const digits = value.replace(/\D/g, "");
if (digits.length < 5) {
return "9999";
}
return "9999-9999-9999";
}
}).mask(input);
Такой подход снижает количество переключений между состояниями.
Динамическая маска в Inputmask строится как сочетание нескольких уровней:
Эти уровни работают совместно, обеспечивая адаптивный ввод данных без жёсткой фиксации структуры.