Управление фокусом в Inputmask строится вокруг синхронизации
поведения маски с DOM-событиями focus, blur,
кликами по полю ввода и программной установкой курсора. Маска не только
форматирует ввод, но и активно вмешивается в позиционирование каретки,
отображение плейсхолдера и реакцию на смену активного элемента
формы.
При инициализации Inputmask навешивает обработчики событий фокуса на целевой элемент. Основные точки входа:
focus — активация поляblur — потеря фокусаПри получении фокуса поведение зависит от конфигурации:
showMaskOnFocus — определяет, отображать ли полную
маску при входе в полеclearMaskOnLostFocus — управляет очисткой незаполненной
маски при уходе из поляInputmask({
mask: "+7 (999) 999-99-99",
showMaskOnFocus: true,
clearMaskOnLostFocus: false
}).mask(document.querySelector("#phone"));
При showMaskOnFocus: true поле при активации заполняется
шаблоном, даже если данных нет. Это важно для визуальной структуры
ввода, особенно в телефонных и датированных масках.
При потере фокуса (blur) Inputmask анализирует
содержимое поля. Если введённые данные не соответствуют маске и включён
clearMaskOnLostFocus, значение сбрасывается.
Inputmask({
mask: "99/99/9999",
clearMaskOnLostFocus: true
}).mask(input);
Одной из ключевых задач Inputmask является контроль позиции курсора. Без этого маска становится неудобной при частичном вводе или редактировании.
Опция определяет, куда устанавливается каретка при клике:
lvp (last valid position)radixFocus (для числовых масок с разделителем)select (выделение всего поля)none (отключение автоустановки)Inputmask({
alias: "numeric",
positionCaretOnClick: "radixFocus"
}).mask(input);
При значении radixFocus курсор автоматически
перемещается к десятичному разделителю, что важно для финансовых
полей.
Определяет поведение при переходе через Tab:
select — выделение содержимогоradixFocus — фокус на дробной частиnone — стандартное поведение браузераInputmask({
alias: "decimal",
positionCaretOnTab: "select"
}).mask(input);
Inputmask не заменяет стандартные методы DOM, но расширяет их поведение через маску.
Работа с фокусом остаётся на уровне DOM-элемента:
const el = document.querySelector("#phone");
const im = Inputmask("+7 (999) 999-99-99").mask(el);
el.focus();
При вызове focus() Inputmask перехватывает событие и
корректирует каретку в соответствии с настройками.
В некоторых версиях используется внутренний метод:
el.inputmask.focus();
el.inputmask.blur();
Это позволяет синхронизировать поведение маски с внутренним состоянием плагина.
После применения маски Inputmask определяет начальную позицию ввода. Она зависит от:
showMaskOnFocusПри пустом поле каретка обычно устанавливается в первую доступную позицию ввода.
Inputmask({
mask: "9999-9999",
placeholder: "_",
showMaskOnFocus: true
}).mask(input);
Если включён placeholder, Inputmask рассчитывает первую
“разрешённую” позицию, пропуская фиксированные символы маски.
Клик по полю обрабатывается с перерасчётом позиции каретки. Inputmask анализирует:
Дополнительно влияет:
greedy — влияет на заполнение и визуальную длинуautoUnmask — изменяет отображаемое значение и может
влиять на выделениеInputmask({
mask: "999-999",
greedy: false,
positionCaretOnClick: "lvp"
}).mask(input);
При greedy: false маска может вести себя более “гибко”,
сокращая видимую длину и изменяя логику позиционирования.
Хотя showMaskOnHover напрямую относится к наведению, он
влияет на фокусное поведение косвенно: при переходе мышью в поле
пользователь уже видит структуру ввода.
Inputmask({
mask: "99/99/9999",
showMaskOnHover: true,
showMaskOnFocus: true
}).mask(input);
Комбинация этих опций делает поведение поля стабильным: структура маски видна до активации и сохраняется после получения фокуса.
При изменении значения программно Inputmask может сбрасывать позицию каретки. Для контроля этого поведения используется:
const el = document.querySelector("#phone");
el.inputmask.setValue("1234567890");
el.inputmask.setCaret(el, 4, 4);
Метод setCaret задаёт диапазон выделения, что позволяет
фиксировать позицию ввода после внешних изменений.
При автозаполнении браузером Inputmask перехватывает событие
input и перерассчитывает маску. Однако поведение фокуса
может отличаться:
focusДля стабилизации поведения используется обработка
onBeforePaste:
Inputmask({
mask: "9999 9999 9999 9999",
onBeforePaste: function (pastedValue) {
return pastedValue.replace(/\s+/g, "");
}
}).mask(input);
После вставки Inputmask пересчитывает позицию каретки согласно правилам маски.
На мобильных браузерах управление фокусом осложняется системной клавиатурой:
focus иногда срабатывает с задержкойInputmask компенсирует это через повторное вычисление позиции после
focus и input.
Особенно важно сочетание:
showMaskOnFocusplaceholderПри переходе через Tab Inputmask может:
Inputmask({
mask: "999-99-9999",
positionCaretOnTab: "select"
}).mask(input);
Это особенно важно в формах с последовательным вводом данных, где пользователь быстро перемещается между полями.
Inputmask предоставляет набор хуков, связанных с фокусом:
onBeforeFocusonFocusonBeforeBluronBlurInputmask({
mask: "99-99",
onBeforeFocus: function () {
return true;
},
onBlur: function () {
console.log("blurred");
}
}).mask(input);
Эти события позволяют вмешиваться в процесс до изменения состояния поля и после него, включая контроль допустимости активации или обработки потери фокуса.
При изменении маски во время активного фокуса возможны нарушения позиции каретки. Inputmask в таких случаях:
el.inputmask.option({
mask: "9999-9999"
});
Изменение конфигурации на лету требует повторной синхронизации состояния фокуса, иначе возможны скачки каретки или сброс выделения.