Работа с масками ввода в чистом JavaScript в экосистеме Inputmask строится вокруг прямого подключения библиотеки и применения маски к DOM-элементам без участия фреймворков, сборщиков или реактивных слоёв. Такой подход называется vanilla-режимом и подразумевает максимальную близость к нативному DOM API.
Vanilla-режим Inputmask опирается на три базовых шага:
querySelector, getElementById,
querySelectorAll)Inputmask().mask()Библиотека при этом перехватывает пользовательский ввод, модифицирует поведение клавиатурных событий и управляет значением поля через внутренний буфер.
В vanilla-сценарии библиотека подключается как глобальный объект
Inputmask, доступный в window.
<script src="inputmask.min.js"></script>
После подключения доступна глобальная функция-конструктор:
const mask = new Inputmask("99-99-9999");
mask.mask(document.querySelector("#date"));
Здесь создаётся маска для формата даты, где 9 означает
обязательную цифру.
Самый распространённый паттерн — применение маски без промежуточных переменных:
Inputmask("(999) 999-9999").mask(document.getElementById("phone"));
Под капотом происходит:
keydown,
input, pasteVanilla-подход легко масштабируется на коллекции DOM-узлов:
const inputs = document.querySelectorAll(".phone-input");
Inputmask("+7 (999) 999-99-99").mask(inputs);
Библиотека автоматически применяет маску ко всем элементам NodeList, обрабатывая их независимо друг от друга.
Помимо строкового шаблона, маска может быть задана через объект конфигурации:
Inputmask({
mask: "9999 9999 9999 9999",
placeholder: "_",
showMaskOnHover: false,
showMaskOnFocus: true
}).mask("#card");
Ключевые параметры:
Внутренний синтаксис Inputmask использует специальные символы:
9 — цифра (0–9)a — буква (A–Z, a–z)* — буквенно-цифровой символ[] — необязательные блоки{} — квантификаторы повторенияПример комбинированной маски:
Inputmask("aa-9999[a]").mask("#code");
Здесь последний символ в квадратных скобках становится необязательным.
В vanilla-режиме часто важно контролировать поведение при потере фокуса:
Inputmask({
mask: "99/99/9999",
clearIncomplete: true
}).mask("#date");
Если пользователь не завершил ввод, значение будет очищено.
Другой режим — сохранение частично введённых данных:
Inputmask({
mask: "99/99/9999",
clearIncomplete: false
}).mask("#date");
Vanilla-режим позволяет изменять маску на лету:
const im = new Inputmask("999-999");
im.mask("#field");
// позже
im.setOptions({ mask: "9999-9999" });
im.mask(document.querySelector("#field"));
Это полезно при изменении логики формы в зависимости от состояния приложения.
Inputmask предоставляет набор callback-событий для отслеживания состояния ввода:
Inputmask({
mask: "9999-9999",
oncomplete: function () {
console.log("Ввод завершён");
},
onincomplete: function () {
console.log("Ввод не завершён");
},
oncleared: function () {
console.log("Поле очищено");
}
}).mask("#phone");
Основные события:
В некоторых сценариях требуется скрывать вводимые данные:
Inputmask({
mask: "9999-9999-9999-9999",
showMaskOnFocus: false,
showMaskOnHover: false
}).mask("#hidden");
Это изменяет поведение UI, но не отключает внутреннюю логику валидации.
Vanilla-режим сохраняет совместимость с нативными формами HTML. Значение input передаётся как обычное поле:
document.querySelector("form").addEventListener("submit", (e) => {
const value = document.querySelector("#phone").value;
});
Библиотека не требует дополнительной сериализации данных.
Помимо шаблонов, поддерживаются regex-маски:
Inputmask({
mask: /[A-Z]{3}-\d{4}/
}).mask("#custom");
Такой режим позволяет описывать сложные форматы, выходящие за пределы стандартных токенов.
Vanilla-подход часто комбинируется с декларативной разметкой:
<input id="phone" data-inputmask="'mask': '(999) 999-9999'">
Инициализация:
Inputmask().mask(document.querySelectorAll("input"));
Библиотека автоматически считывает конфигурацию из DOM.
Внутренний механизм Inputmask анализирует вставленные данные:
Пример:
Inputmask("9999-9999").mask("#field");
При вставке 12345678 автоматически формируется
1234-5678.
Vanilla-режим оптимизирован для работы без зависимостей от виртуального DOM:
Это делает подход предпочтительным для легковесных интерфейсов и классических серверных приложений.
Несмотря на универсальность, существуют ограничения:
Эти ограничения компенсируются простотой и предсказуемостью поведения.