При использовании Inputmask ключевая особенность заключается в том, что значение поля ввода существует в двух представлениях: сырое (unmasked) и отформатированное (masked). При ручном вводе преобразование происходит по событиям input/keydown, однако при программной установке значения поведение зависит от того, через какой механизм и в каком состоянии маска применяется к элементу.
Основная сложность заключается в том, что простое присваивание
value не всегда приводит к корректному применению маски,
особенно если маска уже инициализирована или если значение
устанавливается до завершения привязки Inputmask.
После инициализации Inputmask перехватывает ввод и преобразует его по следующим правилам:
При программной установке значение проходит тот же путь, но только если используется корректный API или если Inputmask “увидит” изменение.
const input = document.querySelector("input");
input.value = "79991234567";
Такой способ:
После инициализации маски:
Inputmask("+7 (999) 999-99-99").mask(input);
input.value = "79991234567";
В этом случае результат зависит от момента выполнения: если Inputmask уже активен, он может не переработать значение автоматически.
Inputmask предоставляет встроенный метод установки значения:
const im = Inputmask("+7 (999) 999-99-99").mask(input);
im.setValue("79991234567");
или через jQuery-интерфейс:
$(input).inputmask("setvalue", "79991234567");
Этот механизм отличается тем, что:
При вызове setValue значение проходит через цепочку
обработки:
onBeforeMask — предварительная нормализация входаphone,
datetime, numeric)Если используется кастомная маска, именно onBeforeMask
часто становится ключевым элементом преобразования.
Позволяет преобразовать входное значение до применения маски:
Inputmask({
mask: "+7 (999) 999-99-99",
onBeforeMask: function (value) {
return value.replace(/\D/g, "");
}
}).mask(input);
В контексте программной установки это означает, что любое значение,
переданное через setValue, также будет нормализовано.
Срабатывает при записи значения в input и позволяет модифицировать итоговый вывод:
onBeforeWrite: function (event, buffer, caretPos, opts) {
return {
refreshFromBuffer: true,
buffer: buffer
};
}
Этот хук влияет на финальное отображение после setValue,
особенно при сложных масках с динамическими сегментами.
Inputmask поддерживает два способа задания значения:
input.inputmask.setValue("+7 (999) 123-45-67");
Значение интерпретируется как уже отформатированное и вставляется напрямую в buffer.
input.inputmask.setValue("79991234567");
В этом случае значение проходит полное форматирование.
Параметр autoUnmask изменяет поведение получения и
установки значения:
Inputmask({
mask: "+7 (999) 999-99-99",
autoUnmask: true
}).mask(input);
При активном autoUnmask:
value может возвращать чистое значениеsetValue чаще работает в режиме raw inputПри использовании React, Vue или Angular возникают дополнительные нюансы:
value через state может конфликтовать
с InputmaskПри многократном вызове setValue:
Особенно это заметно при масках с динамическими токенами
(*, [9], {+}).
При использовании опций:
lazy: trueshowMaskOnHovershowMaskOnFocusпрограммная установка значения может приводить к тому, что:
Для alias numeric и datetime форматирование
при установке особенно чувствительно к локали и конфигурации:
Inputmask({
alias: "numeric",
groupSeparator: " ",
autoGroup: true
}).mask(input);
input.inputmask.setValue("1000000");
Результат:
Для datetime:
Inputmask({
alias: "datetime",
inputFormat: "dd.mm.yyyy"
}).mask(input);
input.inputmask.setValue("20260520");
Значение проходит через парсер даты и приводится к заданному формату.
Ключевой момент при программной установке — расхождение между:
input.valueinput.inputmask._valueSetМетод setValue гарантирует синхронизацию всех трёх
уровней. При прямом присваивании value синхронизация не
выполняется автоматически, что приводит к рассинхронизации поведения
маски при следующем вводе.
После setValue Inputmask:
При сложных масках курсор может быть установлен в первую свободную
позицию или в конец заполненной части в зависимости от конфигурации
greedy и autoUnmask.
Если маска допускает неполные значения:
Inputmask({
mask: "9999-9999",
showMaskOnFocus: true
}).mask(input);
input.inputmask.setValue("123");
Результат:
Некорректные входные значения при setValue не вызывают
исключения, но приводят к:
Например, при numeric маске:
input.inputmask.setValue("12ab34");
буквенные символы будут проигнорированы, если не настроены дополнительные правила обработки.
Поведение Inputmask при программной установке значения определяется сочетанием трёх факторов:
value, setValue, jQuery
API)Корректная работа форматирования достигается только при использовании внутреннего API, который запускает полный цикл преобразования значения через mask engine, buffer и hooks без обхода промежуточных этапов.