IMask.js представляет собой высокопроизводительную библиотеку для создания масок ввода, ориентированную на гибкость, расширяемость и интеграцию с современными фронтенд-стеками. Архитектура построена вокруг модели потоковой обработки ввода, где каждый символ проходит через цепочку преобразований и валидаторов, формируя предсказуемое поведение поля.
Основой работы IMask.js является разделение логики на несколько уровней:
Каждое введённое значение не записывается напрямую в input, а проходит через внутреннюю модель состояния, которая хранит:
Такая модель исключает необходимость ручной синхронизации DOM и состояния, что критически важно при сложных масках.
В IMask.js маска может быть задана несколькими способами:
Статическая строка определяет фиксированный формат:
const mask = IMask(element, {
mask: '+{7}(000)000-00-00'
});
Символ 0 обозначает обязательную цифру, литералы
(скобки, дефисы) интерпретируются как фиксированные элементы.
const mask = IMask(element, {
mask: /^[1-9]\d{0,9}$/
});
Регулярные выражения позволяют задавать строгие правила валидации без структурной сегментации.
Маска может вычисляться динамически:
const maskOptions = {
mask: function (value) {
return value.length > 10
? '+{7}(000)000-00-00'
: '0000000000';
}
};
Это позволяет адаптировать формат ввода к контексту данных.
Ключевая особенность IMask.js заключается в работе с сегментами:
Пример конфигурации с блоками:
const mask = IMask(element, {
mask: {
mask: '000-AAA',
definitions: {
'A': /[A-Z]/
}
}
});
Определения символов позволяют расширять стандартную систему токенов.
Составные маски применяются при необходимости переключения формата в зависимости от вводимого значения:
const mask = IMask(element, {
mask: [
{
mask: '+{7}(000)000-00-00',
},
{
mask: /^\d{10}$/
}
]
});
Система автоматически выбирает подходящий вариант, анализируя ввод.
Одним из сложных аспектов маскирования является управление курсором. IMask.js реализует следующие механизмы:
При вставке строки библиотека разбивает её на токены и распределяет по доступным слотам маски.
Система токенов позволяет гибко описывать правила:
0 — цифра (обязательная)9 — цифра (опциональная)# — любая цифра с дополнительной логикойA — буква* — любой символПользовательские токены:
IMask.createMask({
mask: '000-AAA',
definitions: {
'A': /[A-Z]/,
'0': /[0-9]/
}
});
Такой подход расширяет базовый синтаксис без изменения ядра.
IMask.js предоставляет событийную модель:
accept — вызывается при каждом валидном измененииcomplete — срабатывает при полном заполнении маскиreject — при попытке ввести недопустимый символПример:
mask.on('accept', () => {
console.log(mask.value);
});
mask.on('complete', () => {
console.log('готово');
});
События позволяют строить реактивные формы без дополнительной логики проверки.
Библиотека разделяет:
value — отформатированное значениеunmaskedValue — «сырое» значение без литераловtypedValue — значение с приведением типаПример:
mask.unmaskedValue; // "79001234567"
mask.value; // "+7(900)123-45-67"
Это разделение важно при интеграции с API и базами данных.
Отдельный тип масок предназначен для числовых значений:
const numberMask = IMask(element, {
mask: Number,
scale: 2,
thousandsSeparator: ' ',
radix: '.'
});
Поддерживаются:
Работа с датами включает в себя не только форматирование, но и валидацию календарных значений:
const dateMask = IMask(element, {
mask: Date,
pattern: 'Y-`m-`d',
blocks: {
d: { mask: IMask.MaskedRange, from: 1, to: 31 },
m: { mask: IMask.MaskedRange, from: 1, to: 12 },
Y: { mask: IMask.MaskedRange, from: 1900, to: 2100 }
}
});
Такой подход предотвращает ввод несуществующих дат на уровне маски.
IMask.js используется в связке с современными библиотеками интерфейса:
Общая схема интеграции сводится к привязке экземпляра маски к DOM-элементу и синхронизации состояния через события.
Производительность достигается за счёт:
Даже при сложных составных масках библиотека сохраняет предсказуемое время обработки каждого события ввода.
Inputmask ориентирована на конфигурационные маски с большим количеством готовых шаблонов и плагинов, тогда как IMask.js делает упор на:
В сложных интерфейсах с динамическими правилами ввода подход IMask.js обеспечивает более предсказуемое поведение, тогда как Inputmask часто выигрывает в скорости внедрения стандартных форматов.
При вставке текста алгоритм выполняет:
Автокоррекция применяется к частично введённым данным, приводя их к максимально допустимому состоянию без потери валидных сегментов.
Механизм создания кастомных масок позволяет определять:
Это превращает библиотеку из инструмента форматирования в полноценный движок обработки ввода.