Инициализация экземпляра Cleave представляет собой
ключевой этап подключения библиотеки форматирования ввода. В этот момент
создаётся связка между DOM-элементом и внутренним механизмом обработки
строк, который перехватывает ввод пользователя и преобразует его в
заданный формат в реальном времени.
Основная идея заключается в том, что разработчик передаёт в конструктор конфигурационный объект, описывающий правила форматирования, а библиотека автоматически применяет их к указанному полю ввода.
Создание экземпляра происходит через вызов конструктора:
const cleave = new Cleave(selectorOrElement, options);
selectorOrElement
Принимает:
'#input',
'.phone')document.getElementById('input'))options
Объект конфигурации, определяющий поведение форматирования.
Конфигурационный объект является основой работы Cleave.js. Он может содержать как базовые параметры, так и специализированные настройки для различных типов данных.
numeralВключает режим числового форматирования.
{
numeral: true
}
В этом режиме библиотека автоматически:
numeralDecimalMarkОпределяет символ десятичного разделителя.
{
numeral: true,
numeralDecimalMark: '.'
}
Допустимые значения:
'.' (дефолт в англоязычных системах)',' (часто используется в европейских форматах)delimiterУстанавливает разделитель тысяч.
{
numeral: true,
delimiter: ' '
}
Пример результата:
1000000 → 1 000 000
prefixДобавляет фиксированный префикс к значению.
{
numeral: true,
prefix: '$'
}
Используется для:
noImmediatePrefixУправляет отображением префикса при пустом поле.
{
numeral: true,
prefix: '$',
noImmediatePrefix: true
}
Если включено:
Наиболее распространённый сценарий — форматирование денежных значений.
const priceField = new Cleave('#price', {
numeral: true,
numeralThousandsGroupStyle: 'thousand',
delimiter: ',',
numeralDecimalMark: '.',
prefix: '$'
});
При вводе:
1234567.89
Результат:
$1,234,567.89
Определяет стиль группировки разрядов.
thousandКлассическая группировка по 3 цифры.
1,000,000
lakhИспользуется в индийской системе счисления.
10,00,000
wanИспользуется в китайской системе группировки.
100,0000
Cleave.js может работать и с масками фиксированного формата, например телефонов или дат.
const phone = new Cleave('#phone', {
delimiters: ['(', ') ', '-'],
blocks: [0, 3, 3, 4],
numericOnly: true
});
blocksОпределяет сегментацию строки ввода.
[0, 3, 3, 4]
означает:
delimitersМассив разделителей, вставляемых между блоками:
(XXX) XXX-XXXX
numericOnlyОграничивает ввод только цифрами.
После создания экземпляра Cleave выполняет несколько внутренних операций:
Если поле уже содержит значение, оно немедленно нормализуется согласно правилам.
Подключаются события:
inputkeydowncopypasteБиблиотека хранит:
После инициализации можно программно управлять значением:
cleave.setRawValue('1234567');
Метод принимает неформатированное значение, а форматирование применяется автоматически.
cleave.getFormattedValue();
cleave.getRawValue();
Разделение важно:
raw — используется для отправки на серверformatted — отображение пользователюCleave.js не предназначен для повторной инициализации одного и того же элемента без уничтожения предыдущего экземпляра.
Типичная ошибка:
new Cleave('#input', options);
new Cleave('#input', options);
Это приводит к:
Корректный подход:
const instance = new Cleave('#input', options);
instance.destroy();
Метод destroy() полностью отключает библиотеку от
элемента.
После вызова:
cleave.destroy();
Если input содержит значение до инициализации:
<input id="price" value="1000000">
и применяется:
new Cleave('#price', {
numeral: true,
delimiter: ','
});
значение автоматически преобразуется в:
1,000,000
При инициализации пустого поля библиотека:
Инициализация Cleave.js выполняется синхронно, однако внутренняя логика оптимизирована для минимального количества перерасчётов строки.
Основные оптимизации:
new Cleave('#not-exist', options);
Результат:
Если на input уже действует другая библиотека форматирования, возможны:
Несоответствие длины ввода и блоков приводит к:
Процесс создания экземпляра можно представить как последовательность: