Cleave.js построена вокруг идеи декларативного форматирования
пользовательского ввода: разработчик описывает желаемую структуру
данных, а библиотека синхронно преобразует вводимое значение в заданный
шаблон. Для дат это выражается через параметр date: true и
набор конфигурационных правил, определяющих порядок компонентов,
разделители и ограничения по диапазонам.
Форматирование даты в Cleave.js не является полноценным парсером даты
в стиле Date API. Вместо этого используется маска ввода,
которая контролирует структуру строки на уровне символов. Это важно
учитывать при проектировании интерфейсов: библиотека гарантирует
корректный синтаксис, но не семантическую валидность календарной даты
(например, 31 февраля не будет автоматически исправлен).
Основной механизм включается через параметр:
new Cleave(input, {
date: true
});
В таком виде поведение зависит от региональных настроек по умолчанию, но чаще всего требуется явное задание паттерна:
new Cleave(input, {
date: true,
datePattern: ['d', 'm', 'Y']
});
datePattern определяет порядок сегментов:
d — деньm — месяцY — год (четырёхзначный)y — год (двузначный)Наиболее распространённые комбинации:
['d', 'm', 'Y'] — европейский формат (DD/MM/YYYY)['m', 'd', 'Y'] — американский формат (MM/DD/YYYY)['Y', 'm', 'd'] — ISO-подобный ввод (YYYY/MM/DD)new Cleave(input, {
date: true,
datePattern: ['d', 'm', 'Y'],
delimiter: '.'
});
Результат ввода:
1203202612.03.2026Особенность данного паттерна заключается в высокой читаемости для регионов, где день предшествует месяцу. При этом библиотека не выполняет перестановку значений — она лишь распределяет символы по позициям.
new Cleave(input, {
date: true,
datePattern: ['m', 'd', 'Y'],
delimiter: '/'
});
Поведение:
0312202603/12/2026Данный формат критичен в интерфейсах, ориентированных на интеграцию с внешними API или системами, где ожидается MM/DD/YYYY.
new Cleave(input, {
date: true,
datePattern: ['Y', 'm', 'd'],
delimiter: '-'
});
Результат:
202603122026-03-12Такой формат часто используется в системах хранения данных и при подготовке значений для серверных API, поскольку сохраняет лексикографическую сортировку дат.
Разделитель задаётся через параметр delimiter и не
зависит от логики datePattern. Он используется
исключительно для визуального разделения сегментов.
delimiter: '/'
или
delimiter: '-'
Важно учитывать, что выбор разделителя влияет на восприятие формата, но не на его семантику.
Cleave.js не является валидатором календарных дат. Это означает:
Форматирование работает исключительно на уровне структуры строки.
Хотя дата-режим не предоставляет полноценной валидации диапазонов, косвенный контроль возможен через комбинацию:
onValueChangedПример обработки:
new Cleave(input, {
date: true,
datePattern: ['d', 'm', 'Y'],
onValueChanged: function (e) {
const value = e.target.value;
// внешняя проверка корректности даты
}
});
Одной из ключевых особенностей является поддержка незавершённого ввода. Библиотека допускает промежуточные состояния:
1 → 112 → 121203 → 12/03Это позволяет использовать форматирование в реальном времени без блокировки пользователя.
Каждый сегмент обрабатывается независимо до момента его полного заполнения. Это снижает количество конфликтов при быстром вводе и вставке значений из буфера обмена.
При вставке строки Cleave.js выполняет нормализацию:
datePatternПример:
2026-03-12['d','m','Y']:
12/03/2026Алгоритм ориентирован на извлечение числовых данных, игнорируя разделители исходной строки.
Хотя стандартные паттерны покрывают большинство случаев, возможны гибридные варианты через комбинацию параметров:
new Cleave(input, {
date: true,
datePattern: ['d', 'm', 'Y'],
delimiter: ' - '
});
Результат:
12 - 03 - 2026
Такие конструкции используются в интерфейсах, где визуальное разделение играет роль элемента дизайна.
Cleave.js поддерживает уничтожение и пересоздание экземпляра для смены паттерна:
cleave.destroy();
new Cleave(input, {
date: true,
datePattern: ['Y', 'm', 'd']
});
Прямое изменение конфигурации без пересоздания не поддерживается, поскольку внутреннее состояние привязано к текущей маске.
Частая проблема возникает при отображении одного формата и отправке другого. Например:
DD/MM/YYYYYYYY-MM-DDРешение заключается в разделении слоя отображения и слоя сериализации.
Фиксированный datePattern без адаптации к региону
приводит к неоднозначности ввода. Особенно критично в многоязычных
интерфейсах.
Cleave.js не предназначена для проверки календарной корректности. Попытка использовать её как полноценный валидатор приводит к дублированию логики и ошибкам на серверной стороне.
При интеграции с backend-сервисами важно учитывать, что библиотека возвращает строку, а не структурированный объект даты. Поэтому распространённый подход:
Такой подход обеспечивает разделение ответственности между слоями приложения и предотвращает расхождение форматов данных.