Механизм onKeyUp в библиотеке Inputmask представляет
собой один из ключевых хуков жизненного цикла обработки
пользовательского ввода. Он вызывается после того, как клавиша отпущена,
и маска уже получила сигнал о завершении стандартной клавиатурной
операции, но до финализации некоторых внутренних преобразований
значения.
В отличие от низкоуровневых DOM-событий keyup,
обработчик onKeyUp в контексте Inputmask работает поверх
механизма синхронизации маски, учитывая текущее состояние буфера ввода,
правила маскирования и позицию каретки.
При работе маски ввод проходит через несколько последовательных стадий:
keydown)keypress (в старых реализациях браузеров)keyuponKeyUp (Inputmask-level callback)Важно, что onKeyUp срабатывает уже после того, как
базовая обработка символа завершена, но до финального внешнего
уведомления о стабильном состоянии значения.
Обработчик onKeyUp в Inputmask задаётся через
конфигурацию:
Inputmask({
mask: "(999) 999-9999",
onKeyUp: function (event, buffer, caretPos, opts) {
// логика обработки
}
}).mask(input);
Параметры:
event — оригинальное DOM-событие
keyupbuffer — массив текущих символов маски (внутреннее
представление значения)caretPos — текущая позиция каретки после обработки
вводаopts — объект конфигурации маски, содержащий активные
правила и состоянияБуфер (buffer) представляет собой не строку, а
структурированную последовательность символов, где учитываются:
В onKeyUp этот буфер уже синхронизирован с DOM, но ещё
может находиться в промежуточном состоянии при сложных масках с
динамическими правилами.
Параметр caretPos отражает положение курсора после
завершения обработки нажатой клавиши. Важной особенностью является то,
что Inputmask может изменять позицию каретки автоматически в зависимости
от:
Типовой сценарий использования — анализ того, куда переместился курсор после автоматической корректировки ввода.
onKeyUp вызывается для всех клавиш, которые генерируют
keyup, однако поведение внутри Inputmask различается:
При вводе символов происходит:
onKeyUp с обновлённым состояниемУдаление символов приводит к:
onKeyUp в этом случае часто используется для
отслеживания факта очистки или частичного удаления данных.
Стрелки, Home, End:
caretPosonKeyUp без модификации значенияonKeyUp является частью цепочки событий, в которую также
входят:
onKeyDown — предварительная обработка вводаonBeforeInput — фильтрация символов до вставкиonInput — реакция на изменение значенияonUnMask — извлечение “чистого” значенияВ отличие от них, onKeyUp ориентирован на состояние
после применения всех преобразований, что делает его стабильной
точкой для анализа результата ввода.
Inputmask({
mask: "9999-9999-9999-9999",
onKeyUp: function (event, buffer, caretPos, opts) {
const value = buffer.join("");
const filled = value.replace(/[^0-9]/g, "").length;
if (filled === 16) {
opts.isComplete = true;
}
}
}).mask(document.querySelector("input"));
В данном сценарии onKeyUp используется для определения
степени заполнения поля и установки пользовательского флага
состояния.
При использовании динамических масок (dynamic,
regex, conditional masks) onKeyUp приобретает
дополнительную значимость, поскольку:
В таких условиях onKeyUp отражает уже финальную версию
состояния после всех внутренних перерасчётов.
Несмотря на то, что onKeyUp выглядит как финальная точка
обработки, существуют сценарии, где состояние может измениться
позже:
По этой причине использование onKeyUp для критически
важной логики валидации требует учёта возможных последующих изменений
состояния.
На мобильных клавиатурах поведение keyup может
отличаться:
keyup (например,
autocomplete-сценарии)Inputmask компенсирует это внутренними механизмами синхронизации, но
onKeyUp в таких случаях может срабатывать реже или с
агрегированным состоянием ввода.
При ручном управлении кареткой через API Inputmask
(setCaretPosition, caret) значение
caretPos в onKeyUp может использоваться как
контрольная точка:
onKeyUp вызывается часто, особенно при быстром наборе
текста. В масках с высокой сложностью регулярных выражений или большим
количеством условных правил возможны:
Оптимизация обычно достигается за счёт минимизации логики внутри обработчика и переноса тяжёлых операций в отложенные задачи.