В основе механизма отслеживания изменений в Cleave.js лежит реактивная модель обработки ввода, при которой любое изменение значения в поле немедленно перехватывается, преобразуется и синхронизируется с внутренним состоянием экземпляра. Библиотека не опирается на сторонние state-менеджеры и не требует внешнего контроля формы — все изменения обрабатываются внутри экземпляра через событийный слой и перезапись DOM-значения.
Ключевой принцип заключается в разделении двух представлений данных:
Каждое изменение проходит полный цикл преобразования: ввод → нормализация → форматирование → синхронизация состояния → событие обновления.
Cleave.js привязывается к input-элементу и отслеживает изменения
через события input, keydown,
cut, paste и change. Однако
основным триггером является именно input, так как он
обеспечивает унифицированный поток изменений независимо от источника
ввода (клавиатура, вставка, автозаполнение).
После каждого события выполняется пересчёт значения:
Центральным инструментом отслеживания изменений является
onValueChanged. Он вызывается после каждого пересчёта
значения и предоставляет доступ к текущему состоянию экземпляра.
Callback получает объект состояния:
value — текущее отформатированное значениеrawValue — значение без форматированияprevious — предыдущее состояниеtype — тип изменения (insert, delete, init)target — ссылка на input-элементCallback срабатывает синхронно после завершения внутренней обработки. Это означает, что к моменту вызова DOM уже обновлён, а внутренние буферы синхронизированы.
Cleave.js различает несколько типов операций, что позволяет точно отслеживать поведение пользователя.
Возникает при добавлении символов. Включает:
В этом режиме система анализирует позицию каретки и корректирует её после форматирования.
Срабатывает при удалении символов. Особенность заключается в том, что Cleave.js пытается сохранить логическую целостность маски, даже если пользователь удаляет форматирующие символы (например, пробелы или дефисы).
Инициализационный тип изменения возникает при создании экземпляра. Используется для первичной нормализации уже существующего значения в input.
Отслеживание в реальном времени реализовано через немедленную синхронизацию состояния без промежуточного буфера. Это означает, что любое изменение сразу отражается в:
Такая модель исключает необходимость debounce по умолчанию, однако допускает внешнюю оптимизацию.
Метод setRawValue позволяет программно изменить значение
без необходимости симулировать пользовательский ввод.
После вызова происходит полный цикл обработки:
onValueChangedОсобенность заключается в том, что изменение считается «искусственным», но обрабатывается тем же пайплайном, что и пользовательский ввод.
Для синхронизации внешнего состояния используются методы чтения:
getRawValue — возвращает чистое значениеgetFormattedValue — возвращает отображаемую строкуЭти методы используются в реактивных сценариях, где необходимо отделить бизнес-логику от UI-форматирования.
При интеграции с фреймворками возникает риск зацикливания:
Cleave.js не содержит встроенной защиты от таких циклов, поэтому контроль осуществляется на уровне приложения через сравнение значений:
rawValue перед обновлениемХотя библиотека не ограничивает частоту вызовов
onValueChanged, в высоконагруженных сценариях применяется
внешняя оптимизация.
Используется для сокращения частоты обновлений при быстром вводе:
Применяется для обработки финального состояния после паузы ввода:
Cleave.js при этом продолжает обновлять DOM в реальном времени, даже если внешняя логика ограничена.
Одной из сложных задач является корректировка позиции курсора после форматирования. При каждом изменении Cleave.js:
Это особенно важно при:
При использовании динамических масок (например, определение типа карты или телефона) система пересчитывает правила форматирования при каждом вводе.
Это означает, что:
onValueChanged может отражать смену типа форматаПри подключении к внешним моделям данных (Redux, MobX, Vue reactive, React state) ключевым становится принцип однонаправленного потока данных:
Любая попытка двустороннего биндинга без фильтрации приводит к повторным перерендерам и деградации производительности.
При вставке больших строк (например, номер карты из менеджера паролей) происходит пакетная обработка:
onValueChangedЭто отличается от посимвольного ввода, где событие вызывается на каждом шаге.
Внутри механизма отслеживания изменений используются несколько оптимизаций:
Эти меры позволяют сохранять стабильную работу даже при частых изменениях ввода.
Срабатывает как единичное событие вставки, после чего выполняется полный цикл форматирования.
Обрабатывается как paste-событие с последующей нормализацией.
Система ожидает финализации ввода перед применением форматирования, чтобы избежать промежуточных некорректных состояний.
Внутренний поток можно описать как последовательность:
DOM input event → preprocessing → value normalization → formatting engine → DOM update → state sync → onValueChanged callback
Каждый этап строго синхронный, что обеспечивает предсказуемость поведения и отсутствие расхождений между DOM и внутренним состоянием.