Что такое Cleave.js

Cleave.js — JavaScript-библиотека, предназначенная для автоматического форматирования пользовательского ввода в текстовых полях. Основная идея заключается в том, чтобы отделить «сырые» данные, вводимые пользователем, от визуально структурированного представления, которое повышает читаемость и снижает вероятность ошибок при вводе. Библиотека работает на уровне DOM-элементов и не требует сложной интеграции с фреймворками, хотя может использоваться совместно с React, Vue, Angular и другими современными инструментами.

Ключевая задача Cleave.js заключается в динамическом преобразовании строк, вводимых в input-поля, в заранее определённый формат. При этом исходное значение остаётся логически неизменным, а отображаемое — адаптируется в реальном времени.

Типичные примеры таких преобразований:

  • ввод номера банковской карты: 12345678123456781234 5678 1234 5678
  • телефонный номер: 79001234567+7 900 123 45 67
  • дата: 0101202601/01/2026

Подобное разделение улучшает UX и снижает когнитивную нагрузку при вводе длинных числовых или структурированных значений.

Архитектура работы Cleave.js

В основе библиотеки лежит обработка событий ввода (input, keydown, paste) с последующим преобразованием значения поля. Внутри реализован механизм:

  • перехвата пользовательского ввода
  • очистки строки от лишних символов
  • применения маски или шаблона форматирования
  • обновления значения input без нарушения позиции курсора

Особое внимание уделяется работе с кареткой (cursor position). При изменении строки библиотека пересчитывает позицию курсора так, чтобы пользовательский ввод оставался естественным и не «прыгал» при форматировании.

Основные возможности

Форматирование числовых данных

Cleave.js поддерживает работу с числовыми последовательностями, включая разделение по группам разрядов:

  • тысячи: 10000001 000 000
  • произвольные разделители: запятая, пробел, точка
  • настройка дробной части

Встроенная логика позволяет учитывать локаль и привычные форматы отображения чисел.

Работа с датами

Библиотека предоставляет механизм для форматирования дат с настраиваемыми шаблонами:

  • DD/MM/YYYY
  • MM-YYYY
  • YYYY.MM.DD

При этом учитывается порядок ввода и автоматическое добавление разделителей.

Форматирование телефонных номеров

Одна из наиболее распространённых функций — поддержка международных и локальных телефонных форматов. Cleave.js позволяет:

  • задавать код страны
  • определять маску номера
  • автоматически вставлять пробелы и символы

Пример логики:

+7 (___) ___ __ __

Работа с кредитными картами

Библиотека автоматически распознаёт тип карты по первым цифрам (BIN/IIN) и применяет соответствующее форматирование:

  • Visa
  • MasterCard
  • American Express
  • Discover

Также возможно включение разделения по 4 цифры и валидация длины номера.

Принцип инициализации

Подключение Cleave.js обычно выполняется через создание экземпляра класса Cleave, который привязывается к DOM-элементу:

const cleave = new Cleave('.input-card', {
    creditCard: true
});

Или более универсальный вариант:

const cleave = new Cleave('.input-phone', {
    phone: true,
    phoneRegionCode: 'RU'
});

Конфигурация задаётся через объект параметров, который определяет поведение форматирования.

Конфигурационные параметры

Общие настройки

  • numeral — включение числового режима
  • date — активация работы с датами
  • phone — режим телефонного номера
  • creditCard — режим банковской карты
  • delimiter — символ разделителя
  • prefix — фиксированный префикс (например, валютный)

Поведение ввода

  • noImmediatePrefix — управление отображением префикса
  • rawValueTrimPrefix — удаление префикса при получении «сырого» значения
  • uppercase / lowercase — преобразование регистра

Кастомные блоки

Cleave.js позволяет задавать сложные маски через blocks и delimiter:

new Cleave('.input-custom', {
    blocks: [3, 3, 4],
    delimiter: '-'
});

Результат:

123-456-7890

Обработка событий и жизненный цикл

При инициализации библиотека создаёт внутреннюю модель состояния input-поля. В процессе работы отслеживаются:

  • ввод символов
  • удаление (backspace/delete)
  • вставка (paste)
  • программное изменение value

Каждое изменение проходит через пайплайн:

  1. Захват события
  2. Нормализация строки
  3. Применение маски
  4. Пересчёт позиции курсора
  5. Обновление DOM

Особенность заключается в том, что Cleave.js не блокирует стандартное поведение input, а накладывает поверх него слой обработки.

Работа с «сырыми» данными

Одним из ключевых аспектов является разделение отображаемого значения и исходного значения.

  • отображаемое: 1 000 000
  • сырое: 1000000

Для получения исходного значения используется метод:

cleave.getRawValue();

Это особенно важно при отправке данных на сервер, где форматирование не должно присутствовать.

Поддержка кастомных масок

Cleave.js позволяет создавать собственные маски без привязки к готовым типам. Используются механизмы:

  • blocks — сегментация строки
  • numericOnly — ограничение на числа
  • delimiters — массив или строка разделителей

Пример сложной маски:

new Cleave('.input-code', {
    blocks: [4, 4, 4, 4],
    delimiter: ' '
});

Также возможно комбинирование с регулярными выражениями для предобработки данных.

Обработка вставки из буфера обмена

При вставке текста Cleave.js:

  • очищает строку от недопустимых символов
  • приводит данные к формату маски
  • применяет форматирование к итоговому значению

Это позволяет корректно обрабатывать данные из внешних источников, включая банковские формы и CRM-системы.

Совместимость и интеграции

Библиотека изначально написана на чистом JavaScript и не имеет жёсткой зависимости от фреймворков. Однако часто используется в связке с:

  • React (через обёртки или refs)
  • Vue (директивы или компоненты)
  • Angular (через сервисы и директивы)

Интеграция обычно заключается в привязке экземпляра Cleave к lifecycle-методам компонента.

Особенности поведения при изменении DOM

Cleave.js не требует виртуального DOM и работает напрямую с input-элементами. Однако при динамическом удалении или замене элементов необходимо уничтожать экземпляр:

cleave.destroy();

Это предотвращает утечки памяти и некорректные обработчики событий.

Ограничения модели форматирования

Несмотря на универсальность, библиотека имеет ряд ограничений:

  • не предназначена для сложных многоуровневых форм с зависимыми полями
  • не выполняет валидацию бизнес-логики
  • не хранит состояние формы вне input-элемента
  • ограничена линейными масками форматирования

Фокус остаётся строго на визуальном преобразовании строки ввода в реальном времени.

Поведение при ошибочном вводе

При вводе символов, не соответствующих маске:

  • символы игнорируются или удаляются
  • строка автоматически нормализуется
  • форматирование восстанавливается после каждого изменения

Это обеспечивает устойчивость интерфейса даже при некорректных действиях пользователя.

Принципы проектирования библиотеки

Cleave.js строится на нескольких ключевых принципах:

  • минимальное вмешательство в DOM
  • отсутствие зависимости от фреймворков
  • предсказуемое форматирование
  • сохранение каретки в корректной позиции
  • разделение отображения и данных

Такая архитектура делает библиотеку применимой в широком спектре интерфейсов, где требуется контроль над вводом структурированных данных.