Библиотека Cleave.js поддерживает не только форматирование чисел, дат, телефонов и банковских карт, но и полноценную работу с буквенными последовательностями. Буквенные маски используются в системах, где ввод должен строго соответствовать определённому шаблону:
Главная особенность Cleave.js заключается в автоматическом управлении вводом: библиотека самостоятельно вставляет разделители, ограничивает длину сегментов и поддерживает визуально стабильный формат поля.
Основной механизм буквенных масок строится вокруг параметров
blocks и delimiter.
Простейший пример:
<input id="code">
new Cleave('#code', {
blocks: [3, 3, 3],
delimiter: '-',
uppercase: true
});
Результат ввода:
ABC-DEF-GHI
Здесь:
blocks определяет длину сегментов;delimiter вставляет разделитель;uppercase автоматически переводит символы в верхний
регистр.Параметр uppercase — один из ключевых инструментов при
работе с буквенными кодами.
new Cleave('#serial', {
blocks: [4, 4],
delimiter: ':',
uppercase: true
});
Ввод:
ab12cd34
Преобразуется в:
AB12:CD34
Особенности поведения:
Для некоторых систем требуется строгое использование нижнего регистра.
new Cleave('#slug', {
blocks: [5, 5],
delimiter: '_',
lowercase: true
});
Ввод:
HELLOworld
Результат:
hello_world
Подобный режим часто применяется:
Массив blocks позволяет жёстко ограничивать длину
отдельных частей.
new Cleave('#product', {
blocks: [2, 5, 3],
delimiter: '-',
uppercase: true
});
Формат:
AB-12345-XYZ
Поведение:
| Блок | Максимальная длина |
|---|---|
| Первый | 2 |
| Второй | 5 |
| Третий | 3 |
При превышении длины Cleave.js автоматически переносит курсор к следующему сегменту.
Наиболее распространённый сценарий — смешанный ввод букв и цифр.
new Cleave('#license', {
blocks: [2, 2, 4],
delimiter: '-',
uppercase: true
});
Пример:
AB-12-CD34
Библиотека не запрещает смешивать символы внутри блока, если явно не задана дополнительная фильтрация.
Для сложных схем можно использовать несколько разных разделителей.
new Cleave('#complex', {
blocks: [2, 3, 2],
delimiters: ['/', ':'],
uppercase: true
});
Результат:
AB/CDE:FG
Массив delimiters применяется последовательно между
блоками.
Свойство prefix позволяет добавлять фиксированную
текстовую часть.
new Cleave('#employee', {
prefix: 'EMP',
delimiter: '-',
blocks: [3, 4],
uppercase: true
});
Результат:
EMP-ABC-1234
Префикс:
Иногда префикс должен появляться только после начала ввода.
new Cleave('#client', {
prefix: 'CL',
noImmediatePrefix: true,
blocks: [2, 4],
delimiter: '-'
});
Поведение:
Cleave.js форматирует ввод, но не выполняет строгую валидацию
буквенных символов. Для ограничения допустимых символов используется
обработчик onValueChanged.
new Cleave('#letters-only', {
blocks: [4, 4],
delimiter: '-',
onValueChanged: function (e) {
e.target.value = e.target.value.replace(/[^A-Z\-]/g, '');
}
});
Разрешены только:
Возможна фильтрация под конкретные алфавиты.
new Cleave('#cyrillic', {
blocks: [3, 3],
onValueChanged: function (e) {
e.target.value = e.target.value.replace(/[^А-Яа-я]/g, '');
}
});
Допускаются только символы кириллицы.
Поскольку Cleave.js работает поверх стандартных строк JavaScript, библиотека поддерживает Unicode-символы:
Пример:
new Cleave('#unicode', {
blocks: [2, 2, 2],
delimiter: '-'
});
Ввод:
ЖБ-漢字-AB
На практике буквенные маски часто объединяются с регулярными выражениями.
new Cleave('#passport', {
blocks: [2, 7],
delimiter: ' ',
onValueChanged: function (e) {
e.target.value = e.target.value
.replace(/[^A-Z0-9 ]/g, '')
.toUpperCase();
}
});
Формат:
AB 1234567
Пример маски для номерного знака:
new Cleave('#car', {
blocks: [1, 3, 2],
delimiters: [' ', ' '],
uppercase: true
});
Результат:
A 123 BC
Артикулы часто содержат группы букв и цифр.
new Cleave('#sku', {
blocks: [3, 4, 2],
delimiters: ['-', '/'],
uppercase: true
});
Пример:
ABC-1234/XY
Внутренние системы часто используют длинные буквенные идентификаторы.
new Cleave('#corp', {
blocks: [4, 4, 4, 4],
delimiter: '-',
uppercase: true
});
Формат:
ABCD-EFGH-IJKL-MNOP
Подобная структура облегчает:
Метод getRawValue() возвращает строку без
разделителей.
const cleave = new Cleave('#promo', {
blocks: [4, 4],
delimiter: '-',
uppercase: true
});
console.log(cleave.getRawValue());
Если пользователь ввёл:
ABCD-EFGH
Метод вернёт:
ABCDEFGH
Это особенно важно:
Конфигурацию можно менять во время работы приложения.
const instance = new Cleave('#dynamic', {
blocks: [3, 3],
delimiter: '-'
});
Позже:
instance.destroy();
new Cleave('#dynamic', {
blocks: [4, 4, 4],
delimiter: ':',
uppercase: true
});
Пример буквенной маски в React:
import Cleave from 'cleave.js/react';
function App() {
return (
<Cleave
options={{
blocks: [4, 4],
delimiter: '-',
uppercase: true
}}
/>
);
}
mounted() {
new Cleave(this.$refs.code, {
blocks: [3, 3, 3],
delimiter: '-',
uppercase: true
});
}
ngAfterViewInit() {
new Cleave('#field', {
blocks: [2, 2, 2],
delimiter: ':',
uppercase: true
});
}
Неправильная последовательность обработки:
input.addEventListener('input', function () {
this.value = this.value.replace(/\d/g, '');
});
Подобная логика может конфликтовать с внутренним управлением курсором Cleave.js.
Ошибка:
value.replace(/-/g, '')
Если обработка выполняется некорректно, формат может ломаться во время ввода.
Создание нескольких экземпляров для одного поля:
new Cleave('#id', {...});
new Cleave('#id', {...});
Может привести к:
Большие буквенные шаблоны:
blocks: [4,4,4,4,4,4,4]
Обычно работают быстро, поскольку Cleave.js:
Однако чрезмерно сложная логика внутри onValueChanged
может вызывать задержки.
new Cleave('#universal-id', {
blocks: [3, 3, 4, 2],
delimiters: ['-', '/', '-'],
uppercase: true,
onValueChanged: function (e) {
e.target.value = e.target.value.replace(
/[^A-Z0-9\-\/]/g,
''
);
}
});
Результат:
ABC-DEF/1234-XY
Особенности реализации: