Cleave.js представляет собой клиентскую библиотеку для форматирования пользовательского ввода в реальном времени. Основная задача — отделить «сырые» данные, вводимые в поле формы, от их визуального представления, сохраняя при этом корректное значение для дальнейшей обработки.
Инициализация начинается с создания экземпляра, привязанного к DOM-элементу input. Библиотека перехватывает события ввода и применяет правила форматирования по мере набора текста.
const cleave = new Cleave(inputElement, {
delimiters: [' ', ' ', '-'],
blocks: [3, 3, 2, 2],
numericOnly: true
});
В данном примере форматирование разбивает строку на блоки фиксированной длины, вставляя разделители между ними.
Подключение возможно через сборщики модулей или напрямую через script-тег.
<script src="cleave.min.js"></script>
При использовании модульной системы:
import Cleave from 'cleave.js';
После подключения становится доступен конструктор, который используется для привязки логики форматирования к полям ввода.
Экземпляр создаётся один раз на каждый input-элемент. Внутри
происходит подписка на события input, keydown,
copy, paste.
const phoneInput = document.querySelector('#phone');
const cleavePhone = new Cleave(phoneInput, {
phone: true,
phoneRegionCode: 'US'
});
При использовании телефонного режима библиотека автоматически применяет шаблоны форматирования в зависимости от региона.
Параметр blocks определяет разбиение строки на сегменты
фиксированной длины.
blocks: [4, 4, 4, 4]
Каждый элемент массива задаёт длину очередного блока символов.
Параметр delimiters задаёт символы-разделители между
блоками.
delimiters: ['-', '-', '-']
Количество разделителей должно соответствовать количеству переходов между блоками.
Ограничивает ввод только числовыми символами.
numericOnly: true
Любые нечисловые символы автоматически игнорируются при вводе.
Позволяет задавать фиксированный префикс, который остаётся неизменным при вводе.
prefix: '+7'
Префикс не удаляется пользователем и всегда сохраняется в начале значения.
Телефонный режим активируется через параметр phone.
new Cleave(inputElement, {
phone: true,
phoneRegionCode: 'RU'
});
В этом режиме применяется региональная логика формирования номера, включая код страны и структуру локального номера.
Позволяет форматировать числа с разделителями тысяч.
new Cleave(inputElement, {
numeral: true,
numeralThousandsGroupStyle: 'thousand'
});
Поддерживаются различные стили группировки чисел, включая стандартный и индийский формат.
Значение можно получить напрямую из инстанса через свойство
value.
const value = cleavePhone.getRawValue();
Метод getRawValue возвращает необработанное значение без
форматирования, что важно при отправке данных на сервер.
Форматированное значение доступно через DOM-элемент:
console.log(phoneInput.value);
Изменение параметров возможно через метод setRawValue и
повторную инициализацию.
cleavePhone.setRawValue('79991234567');
После установки нового значения библиотека автоматически применяет текущие правила форматирования.
При динамическом удалении поля ввода необходимо освободить обработчики событий.
cleavePhone.destroy();
После вызова destroy форматирование прекращается, а
исходное поведение input восстанавливается.
Библиотека не требует ручной обработки событий, однако поведение можно расширять через стандартные DOM-события.
inputElement.addEventListener('input', (e) => {
console.log(e.target.value);
});
Форматирование применяется до того, как значение становится доступным в обработчике.
При вставке текста библиотека автоматически очищает и преобразует данные согласно конфигурации.
Например, при вставке строки с пробелами и символами форматирования:
+7 (999) 123-45-67
значение будет приведено к заданному шаблону без лишних символов.
В основе работы лежит механизм разбиения строки на токены и последующего пересборки с учётом правил:
Особое внимание уделяется сохранению позиции каретки при динамическом форматировании, что обеспечивает непрерывный пользовательский ввод без «скачков» курсора.
При программной модификации значения важно учитывать, что библиотека всегда пересчитывает формат.
cleavePhone.setRawValue('1234567890');
После выполнения происходит повторное применение всех правил форматирования, включая блоки, разделители и префиксы.
Функциональность ориентирована на клиентское форматирование и не выполняет:
Форматирование остаётся исключительно визуальным и вспомогательным механизмом подготовки данных.