В текстовых полях с маской поведение курсора определяется не только стандартной логикой браузера, но и правилами маски, которые управляют допустимыми позициями ввода. При использовании Inputmask обычная модель «клик → установка каретки в точку клика» заменяется алгоритмом сопоставления позиции клика с ближайшим допустимым слотом маски.
Каретка в контексте маски — это указатель текущей позиции ввода, который должен учитывать:
Без дополнительной настройки клик внутри поля приводит к пересчёту позиции каретки через внутренний механизм адаптации маски.
При стандартной конфигурации Inputmask выполняет следующие шаги:
Особенность заключается в том, что позиция клика почти никогда не совпадает с реальной позицией ввода. Например, в маске вида:
+7 (999) 999-99-99
клик по символу ( или пробелу не может установить
каретку туда напрямую, и происходит «перепривязка» к ближайшему
9.
Поведение клика контролируется параметром
positionCaretOnClick, который задаёт стратегию установки
каретки при взаимодействии с полем ввода.
Основная задача параметра — определить, насколько строго Inputmask должен уважать позицию клика пользователя.
Механизм применяется только при событиях:
В простейшем варианте параметр принимает логическое значение:
true — активирует интеллектуальное позиционирование
каретки,false — отключает перерасчёт позиции клика.При отключённом режиме поведение упрощается: каретка чаще устанавливается в первую доступную позицию ввода или в конец уже заполненной части маски.
В более сложных конфигурациях используется стратегический подход, при котором позиция клика не просто принимается или игнорируется, а перерасчитывается по правилам маски.
Логика включает:
Если поле уже частично заполнено, позиционирование каретки становится зависимым от состояния данных:
Mask engine различает два типа символов:
_ или
9),При расчёте позиции каретки:
Пример:
(999) 999-9999
Клик на ) приведёт к установке каретки в ближайший
9, так как литерал не является точкой ввода.
Алгоритм позиционирования можно представить как последовательность шагов:
Получение абсолютного индекса клика.
Проверка соответствия символа маске.
Поиск ближайшего input-слота:
Проверка доступности позиции (не заблокирована ли она правилом mask definition).
Установка каретки.
Важной особенностью является то, что алгоритм не работает с «визуальной» позицией текста, а опирается на внутреннее представление маски.
При наличии введённых данных поведение становится контекстным.
Каретка устанавливается в первый доступный незаполненный слот.
Происходит попытка определить ближайшую позицию редактирования, которая:
Если маска содержит фиксированный префикс (например,
+7), клик до него игнорируется, и каретка переносится сразу
после префикса.
На мобильных устройствах поведение усложняется из-за особенностей touch-интерфейса:
Inputmask компенсирует это дополнительной нормализацией позиции:
Если при клике происходит выделение части строки,
positionCaretOnClick учитывает:
При конфликте между выделением и маской приоритет обычно отдаётся корректной структуре маски, а не пользовательскому выделению.
В расширенных сценариях поведение позиционирования может быть переопределено функцией. Такой подход используется для:
Функция получает контекст события и текущую позицию, после чего возвращает индекс каретки.
Типовая логика внутри функции:
Это позволяет реализовать поведение вроде:
Автозаполнение браузера может изменять значение input до срабатывания click-обработчиков, что влияет на позиционирование каретки.
В таких случаях:
positionCaretOnClick применяется уже к финальному
состоянию строки,Поведение positionCaretOnClick тесно связано с:
showMaskOnHover — влияет на визуальное восприятие
позиции,autoUnmask — может менять длину строки и сдвигать
индексы,clearIncomplete — изменяет доступность слотов,greedy — влияет на распределение placeholder-ов.При изменении этих параметров алгоритм позиционирования может существенно меняться даже при одинаковом клике.
Некорректная конфигурация приводит к характерным проблемам:
Причина почти всегда связана с конфликтом между стратегией позиционирования и структурой маски.
Внутренне маска рассматривается как набор слотов:
positionCaretOnClick управляет тем, в какой слот будет
переведена каретка после события click, минимизируя отклонения от
допустимой структуры ввода и обеспечивая согласованность между
визуальной позицией и логической моделью маски.