Механизм генерации масок через функции в Inputmask позволяет формировать структуру ввода динамически, опираясь на внешние параметры, состояние поля, пользовательские данные или контекст выполнения. Вместо статического шаблона маски используется функция, возвращающая конфигурацию или строковое представление маски, что открывает возможность адаптивного поведения поля ввода.
Функциональная маска в Inputmask может быть представлена как:
Базовая идея заключается в том, что маска перестаёт быть фиксированной и становится вычисляемой сущностью.
Функции генерации маски обычно получают доступ к параметрам состояния:
Типичная форма:
const maskFunction = function (opts) {
return "+7 (999) 999-99-99";
};
В расширенном варианте:
const maskFunction = function (opts) {
if (opts && opts.country === "kz") {
return "+7 (700) 000-00-00";
}
return "+1 (999) 999-9999";
};
Функциональные маски часто применяются для адаптации ввода под:
Пример выбора формата телефона:
const phoneMask = function (opts) {
switch (opts.region) {
case "ru":
return "+7 (999) 999-99-99";
case "us":
return "+1 (999) 999-9999";
case "de":
return "+49 9999 999999";
default:
return "+9{1,3} 999 999 9999";
}
};
Функция выполняет роль маршрутизатора масок, централизуя логику выбора.
Функции могут формировать маску на основе уже введённых данных. Это позволяет строить адаптивные структуры, например:
Пример изменения длины по первому символу:
const dynamicMask = function (opts) {
const value = opts.value || "";
if (value.startsWith("8")) {
return "9 (999) 999-99-99";
}
if (value.startsWith("7")) {
return "+7 (999) 999-99-99";
}
return "+9{1,3} (999) 999-9999";
};
Такой подход позволяет учитывать частично введённые данные ещё до завершения ввода.
Функции генерации маски могут возвращать не только строку, но и объект с параметрами:
const configMask = function (opts) {
return {
mask: "+7 (999) 999-99-99",
placeholder: "_",
showMaskOnHover: false
};
};
Это позволяет централизованно управлять:
Сложные сценарии требуют композиции логики. Функции могут вызывать другие функции, формируя многоуровневую систему генерации.
const getPhoneMaskByCountry = function (country) {
if (country === "kz") return "+7 (700) 000-00-00";
if (country === "ru") return "+7 (999) 999-99-99";
return "+1 (999) 999-9999";
};
const maskFactory = function (opts) {
return getPhoneMaskByCountry(opts.country);
};
Такая декомпозиция повышает переиспользуемость и упрощает сопровождение.
Один из частых сценариев — адаптация структуры под количество введённых символов:
const lengthBasedMask = function (opts) {
const len = (opts.value || "").length;
if (len <= 3) return "999";
if (len <= 6) return "999-999";
return "999-999-9999";
};
Функция фактически реализует поведенческую модель, где маска эволюционирует вместе с вводом.
Функциональная генерация масок часто интегрируется через alias-конфигурации:
Inputmask.extendAliases({
dynamicPhone: {
mask: function (opts) {
if (opts.country === "ru") {
return "+7 (999) 999-99-99";
}
return "+9{1,3} (999) 999-9999";
}
}
});
Такой подход позволяет подключать динамическую логику как стандартный тип маски.
Хотя сама функция маски синхронна, часто используется внешний слой, который подготавливает параметры:
После получения данных вызывается инициализация:
fetch("/api/user-settings")
.then(r => r.json())
.then(data => {
Inputmask({
mask: function () {
return data.phoneFormat;
}
}).mask(document.querySelector("input"));
});
Функция выступает как адаптер между внешними данными и механизмом маскирования.
При использовании функций генерации важно учитывать порядок переопределения:
Функция mask имеет приоритет над статическими значениями, что позволяет реализовать контекстно-зависимое поведение.
Несмотря на гибкость, функциональная генерация масок имеет особенности:
Поэтому часто применяется баланс между статическими масками и вычисляемыми функциями.
Устойчивые генераторы масок обычно следуют ряду принципов:
Пример структурированного подхода:
const masks = {
ru: "+7 (999) 999-99-99",
us: "+1 (999) 999-9999"
};
const getMask = function (country) {
return masks[country] || "+9{1,3} (999) 999-9999";
};
const dynamicMask = function (opts) {
return getMask(opts.country);
};
Функции могут учитывать дополнительные параметры:
const contextualMask = function (opts) {
if (opts.readonly) {
return "*{+} 999 999 9999";
}
if (opts.mode === "international") {
return "+999 (999) 999-999";
}
return "+7 (999) 999-99-99";
};
Функциональные маски тесно связаны с потоком ввода. Изменение значения может приводить к:
Это создаёт динамическую систему, в которой маска является реакцией на состояние данных, а не фиксированным шаблоном.