Inputmask строится вокруг идеи последовательной обработки пользовательского ввода через цепочку преобразований. Любое значение проходит несколько стадий: захват события, предварительная нормализация, применение маски, валидация, финальная запись в input и обратное преобразование при чтении значения.
В этой цепочке используются хуки (hooks) — точки перехвата, позволяющие вмешиваться в поток данных до или после ключевых операций. В более широком смысле эти механизмы образуют слой middleware-подобной архитектуры, где каждый обработчик может модифицировать входные данные или поведение маски.
onBeforeMaskХук вызывается перед применением маски к исходному значению (например, при инициализации или программной установке значения).
Используется для:
Пример:
Inputmask({
mask: "+7 (999) 999-99-99",
onBeforeMask: function (value) {
return value.replace(/[^\d]/g, "");
}
}).mask(document.querySelector("input"));
Поведение:
onBeforePasteХук срабатывает при вставке данных из буфера обмена до обработки маской.
Основные задачи:
Inputmask({
mask: "9999-9999-9999-9999",
onBeforePaste: function (pastedValue) {
return pastedValue.replace(/\s+/g, "");
}
}).mask(input);
Особенность:
onBeforeWriteОдин из ключевых middleware-хуков, вызывается перед записью значения в input после обработки маской.
Позволяет:
Inputmask({
mask: "999-99-9999",
onBeforeWrite: function (event, buffer, caretPos, opts) {
if (buffer.join("").startsWith("000")) {
return false; // блокировка записи
}
}
}).mask(input);
Сигнатура обычно включает:
onBeforeValidateИспользуется в промежуточной стадии валидации символов. Позволяет
вмешаться до применения правил definitions.
Основные сценарии:
Inputmask({
mask: "a{1,3}-999",
onBeforeValidate: function (chars, buffer, position) {
return chars.toLowerCase();
}
});
Каждый ввод проходит через серию преобразователей:
keydown, input,
paste)onBeforePaste,
onBeforeMask)definitions)onBeforeWrite)Эта структура фактически реализует pipeline middleware, где каждый слой может:
Помимо хуков, Inputmask предоставляет механизм
definitions, который можно рассматривать как декларативный
middleware для символов маски.
Inputmask({
mask: "X-999",
definitions: {
"X": {
validator: "[A-F]",
casing: "upper"
}
}
}).mask(input);
Здесь каждый символ проходит обработчик:
Inputmask также предоставляет события, которые дополняют middleware-цепочку:
oncomplete — маска заполнена полностьюonincomplete — маска не завершенаoncleared — значение очищеноonKeyValidation — результат проверки клавишиПример:
Inputmask({
mask: "999-999",
oncomplete: function () {
console.log("Маска заполнена");
},
onincomplete: function () {
console.log("Маска не завершена");
}
}).mask(input);
Эти события не изменяют данные напрямую, но расширяют контроль над состоянием маски.
Каждый хук получает доступ к внутреннему состоянию:
Это позволяет строить сложные сценарии, где поведение зависит не только от входных данных, но и от текущего состояния поля.
При конфликте нескольких модификаций действует правило последовательности:
onBeforePaste → onBeforeMask → definitions → onBeforeValidate → onBeforeWrite
Любое вмешательство на раннем этапе сильнее влияет на итоговый результат, чем постобработка.
Хуки часто используются для динамического изменения маски в зависимости от вводимых данных.
Inputmask({
mask: function (opts) {
return opts.phoneType === "international"
? "+99 (999) 999-9999"
: "(999) 999-9999";
},
onBeforeMask: function (value) {
return value;
}
}).mask(input);
Здесь middleware-логика определяет структуру маски на лету.
Несколько хуков могут работать совместно, формируя цепочку преобразований:
Inputmask({
mask: "9999 9999",
onBeforePaste: v => v.replace(/\D/g, ""),
onBeforeMask: v => v.slice(0, 8),
onBeforeWrite: (e, buffer) => buffer
}).mask(input);
Каждый этап выполняет свою узкую роль:
Хуки Inputmask часто комбинируются с нативными событиями браузера:
inputchangekeydownblurПри этом важно учитывать, что Inputmask перехватывает и переопределяет часть стандартного поведения ввода, создавая собственный слой абстракции над DOM-событиями.
Middleware-хуки работают внутри этого слоя, а не поверх него, что делает их более предсказуемыми по сравнению с внешними обработчиками событий.
setValue, если не активирован пересчёт маскиjitMasking поведение
onBeforeWrite может отличаться из-за ленивой генерации
символовInputmask позволяет расширять базовые маски через alias, где middleware-логика может быть встроена в переиспользуемые шаблоны.
Inputmask.extendAliases({
"custom-phone": {
mask: "+7 (999) 999-99-99",
onBeforePaste: function (v) {
return v.replace(/[^\d]/g, "");
}
}
});
Такой подход превращает хуки в часть декларативной конфигурации, а не локальной логики.
При вызове:
inputmask.setValue("123456789");
последовательность обработки повторяет middleware pipeline:
onBeforeMaskonBeforeWriteЭто обеспечивает единообразие между пользовательским вводом и программными изменениями.