Одной из ключевых возможностей библиотеки Cleave.js является механизм
блоков (blocks). Он позволяет разбивать вводимые данные на
группы символов фиксированной длины. Такой подход применяется при
форматировании:
Механизм блоков работает на основе массива чисел, где каждое число определяет длину очередного сегмента.
Простейший пример:
new Cleave('.input', {
blocks: [4, 4, 4, 4],
delimiter: '-'
});
Результат ввода:
1234-5678-9012-3456
Каждый элемент массива blocks определяет количество
символов до автоматической вставки разделителя.
При вводе символов Cleave.js:
Массив:
blocks: [3, 2, 5]
создаёт структуру:
XXX-XX-XXXXX
где:
delimiterРазделитель между блоками задаётся свойством
delimiter.
Пример с пробелом:
new Cleave('.input', {
blocks: [4, 4, 4, 4],
delimiter: ' '
});
Результат:
1234 5678 9012 3456
Пример с точкой:
new Cleave('.input', {
blocks: [2, 2, 2],
delimiter: '.'
});
Результат:
12.34.56
delimitersЕсли требуется использовать разные разделители между сегментами,
применяется массив delimiters.
new Cleave('.input', {
blocks: [3, 3, 3],
delimiters: ['.', '-']
});
Результат:
123.456-789
Соответствие происходит последовательно:
| Блок | Разделитель |
|---|---|
| после первого | . |
| после второго | - |
Количество разделителей обычно на единицу меньше количества блоков.
Общая длина определяется суммой блоков.
Пример:
blocks: [2, 2, 2]
Максимально допустимый ввод:
6 символов
При попытке ввода лишних символов Cleave.js автоматически их игнорирует.
Блоки работают независимо от типа данных. Ограничение типов реализуется отдельно.
Пример буквенно-цифрового кода:
new Cleave('.license', {
blocks: [3, 3, 4],
delimiter: '-',
uppercase: true
});
Результат:
ABC-123-DE45
numericOnlyДля разрешения только цифр используется параметр
numericOnly.
new Cleave('.code', {
blocks: [4, 4, 4],
delimiter: '-',
numericOnly: true
});
Теперь любые буквы будут автоматически удаляться.
uppercasenew Cleave('.serial', {
blocks: [4, 4, 4],
delimiter: '-',
uppercase: true
});
Ввод:
ab12cd34ef56
Преобразуется в:
AB12-CD34-EF56
lowercasenew Cleave('.serial', {
blocks: [4, 4],
delimiter: ':',
lowercase: true
});
Результат:
ab12:cd34
prefixnew Cleave('.account', {
prefix: 'ACC',
blocks: [3, 4, 4],
delimiter: '-'
});
Результат:
ACC123-4567-8901
Префикс не считается частью блока, а добавляется отдельно.
noImmediatePrefixnew Cleave('.account', {
prefix: 'ID',
noImmediatePrefix: true,
blocks: [4, 4]
});
Префикс появится только после начала ввода.
new Cleave('.serial', {
blocks: [2, 4, 4, 2],
delimiters: ['/', '-', '/'],
uppercase: true
});
Результат:
AB/1234-5678/CD
В Cleave.js длина блоков задаётся статически. Однако конфигурацию можно менять динамически.
Пример изменения шаблона:
const cleave = new Cleave('.input', {
blocks: [4, 4, 4, 4]
});
function switchFormat() {
cleave.destroy();
new Cleave('.input', {
blocks: [3, 3, 3],
delimiter: '.'
});
}
Блоки могут иметь произвольную длину.
blocks: [1, 8, 2, 16]
Результат:
A-12345678-99-1234567890123456
Формат даты фактически основан на тех же блоках.
new Cleave('.date', {
date: true,
datePattern: ['d', 'm', 'Y']
});
Внутри используется структура:
blocks: [2, 2, 4]
new Cleave('.time', {
time: true,
timePattern: ['h', 'm', 's']
});
Внутренне применяется:
blocks: [2, 2, 2]
const cleave = new Cleave('.input', {
blocks: [4, 4, 4],
delimiter: '-'
});
document.querySelector('.input')
.addEventListener('input', function(event) {
console.log(event.target.value);
console.log(cleave.getRawValue());
});
| Метод | Результат |
|---|---|
value |
форматированное значение |
getRawValue() |
данные без разделителей |
Разделителем может быть практически любой символ.
new Cleave('.input', {
blocks: [3, 3, 3],
delimiter: '|'
});
Результат:
123|456|789
new Cleave('.input', {
blocks: [2, 2, 2],
delimiter: '•'
});
Результат:
12•34•56
Cleave.js автоматически корректирует позицию курсора:
Это особенно важно для длинных шаблонов:
blocks: [4, 4, 4, 4, 4, 4]
При нажатии Backspace:
1234-5678
удаление происходит корректно:
1234-567
а не:
1234--567
Библиотека самостоятельно управляет разделителями.
При вставке строки:
123456789012
и конфигурации:
blocks: [4, 4, 4],
delimiter: '-'
результат автоматически станет:
1234-5678-9012
Разделители можно отключить.
new Cleave('.input', {
blocks: [3, 3, 3],
delimiter: ''
});
Визуально разделения не будет, однако ограничение длины сегментов сохранится внутренне.
const cleave = new Cleave('.input', {
blocks: [4, 4, 4],
delimiter: '-',
uppercase: true
});
document.querySelector('.input')
.addEventListener('blur', function() {
const raw = cleave.getRawValue();
if (raw.length !== 12) {
console.log('Ошибка длины');
}
});
import Cleave from 'cleave.js/react';
function App() {
return (
<Cleave
options={{
blocks: [4, 4, 4, 4],
delimiter: '-'
}}
/>
);
}
mounted() {
new Cleave(this.$refs.input, {
blocks: [3, 3, 3],
delimiter: '.'
});
}
ngAfterViewInit() {
new Cleave(this.input.nativeElement, {
blocks: [2, 2, 4],
delimiter: '/'
});
}
Некорректно:
blocks: [3, 3, 3],
delimiters: ['-']
Корректно:
blocks: [3, 3, 3],
delimiters: ['-', '-']
numericOnly и буквенных данныхnumericOnly: true
не позволит вводить:
ABCD
Конфигурация:
blocks: [1, 1, 1, 1, 1, 1]
может создавать неудобное перемещение курсора и ухудшать UX.
Для длинных кодов рекомендуется:
Пример рациональной структуры:
blocks: [4, 4, 4, 4]
вместо:
blocks: [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
При работе Cleave.js хранит:
Именно благодаря этому библиотека способна корректно: