Поведение маски ввода в Inputmask строится вокруг перехвата
пользовательских действий и преобразования их в согласованное состояние
поля ввода. Ключевую роль в этом процессе играют хуки уровня
клавиатурного ввода и уровня записи значения в input. Среди них особое
значение имеют onKeyDown и onBeforeWrite, так
как они находятся на разных этапах жизненного цикла обработки ввода и
позволяют вмешиваться в процесс с разной степенью контроля.
onKeyDown вызывается в момент нажатия клавиши, до того
как браузер выполнит стандартное изменение значения input. На этом этапе
Inputmask получает доступ к «сырому» намерению пользователя — факту
нажатия клавиши, включая код клавиши, модификаторы и текущее состояние
маски.
Основные характеристики этапа:
event.key, event.code,
ctrlKey, altKey, shiftKeyЭтот уровень обработки используется для:
В контексте Inputmask onKeyDown часто выступает как
фильтр первого уровня, позволяющий предотвратить ненужные операции ещё
до этапа перерасчёта маски.
Логика обработки на этом этапе строится вокруг анализа клавиши и текущего состояния маски. Типичный сценарий включает проверку допустимости действия и возврат управляющего результата.
Ключевые сценарии использования:
Внутри Inputmask этот этап тесно связан с механизмом caret-менеджмента, так как изменение позиции курсора до применения изменений позволяет избежать неконсистентного состояния.
На уровне keydown отсутствует итоговое значение, поэтому любые вычисления происходят на основе:
Это делает этап чувствительным к асинхронным изменениям состояния DOM. В отличие от более поздних стадий, здесь невозможно опираться на «будущее» значение поля — только на предполагаемое действие.
После обработки события клавиатуры Inputmask переходит к вычислению нового состояния строки. На этом этапе формируется промежуточное представление значения, которое ещё не записано в DOM, но уже существует в логике маски.
Именно здесь подготавливается структура, которая затем будет передана в этап записи.
onBeforeWrite вызывается непосредственно перед тем, как
новое значение будет записано в input. В отличие от
onKeyDown, этот хук работает уже с результатом вычислений
маски.
Основные характеристики:
Этот этап можно рассматривать как финальный фильтр и трансформер результата.
На момент вызова onBeforeWrite доступны:
Это позволяет выполнять не только фильтрацию, но и структурную модификацию результата.
onBeforeWrite используется для:
В отличие от onKeyDown, здесь уже нет необходимости
интерпретировать намерение пользователя — оно уже преобразовано в
итоговую операцию.
Разделение onKeyDown и onBeforeWrite
отражает двухуровневую архитектуру управления вводом.
onKeyDown: уровень намерения
onBeforeWrite: уровень результата
Между onKeyDown и onBeforeWrite Inputmask
выполняет несколько внутренних шагов:
Это промежуточное состояние не является частью DOM, но критично для корректной работы системы маскирования.
При вставке текста различие между этапами становится особенно заметным:
onKeyDown может зафиксировать Ctrl+V или Cmd+VonBeforeWrite получает уже обработанную строкуТаким образом, управление вставкой распределяется между уровнями: первый фиксирует действие, второй контролирует результат.
Позиция курсора является одной из ключевых сущностей в Inputmask и обрабатывается на обоих уровнях.
На onKeyDown:
На onBeforeWrite:
Разделение позволяет избежать рассинхронизации между визуальным курсором и внутренним состоянием маски.
Хотя оба хука работают в синхронном контексте, их поведение может взаимодействовать с внешними асинхронными изменениями состояния:
В таких случаях onBeforeWrite становится более надёжной
точкой контроля, так как оперирует уже вычисленным результатом,
независимо от источника изменения.
Несмотря на высокую степень контроля, onKeyDown имеет
ограничения:
Поэтому его использование эффективно только для ранней фильтрации и блокировки.
onBeforeWrite, в свою очередь, ограничен тем, что:
Это делает его непригодным для задач блокировки ввода, но оптимальным для форматирования.
Архитектура Inputmask предполагает совместное использование обоих хуков:
onKeyDown управляет входным потоком событийonBeforeWrite управляет итоговым состоянием данныхТакая модель обеспечивает разделение ответственности между:
При сложных масках (например, с условными сегментами, динамическими
разделителями или переменной длиной блоков) взаимодействие
onKeyDown и onBeforeWrite становится
критическим.
Типичные проблемы, решаемые этим разделением:
Разнесение логики по этапам позволяет изолировать эти проблемы и обрабатывать их на соответствующем уровне.