Одна из самых распространённых ошибок при использовании библиотеки Inputmask связана с неправильным порядком подключения Javascript-файлов. Особенно часто проблема возникает при подключении дополнительных модулей, расширений или jQuery-версии библиотеки.
Некорректный порядок:
<script src="jquery.inputmask.min.js"></script>
<script src="inputmask.min.js"></script>
В этом случае jQuery-плагин пытается использовать объект
Inputmask, который ещё не был объявлен.
Правильный порядок:
<script src="inputmask.min.js"></script>
<script src="jquery.inputmask.min.js"></script>
При использовании модульной системы ES Modules ошибка может выглядеть иначе:
import "inputmask/dist/jquery.inputmask";
import Inputmask from "inputmask";
Корректный вариант:
import Inputmask from "inputmask";
import "inputmask/dist/jquery.inputmask";
Типичные симптомы проблемы:
Inputmask is not definedCannot read property ... of undefined.inputmask()Частая ошибка — многократное применение маски к одному и тому же элементу.
Проблемный код:
const input = document.querySelector("#phone");
Inputmask("+7 (999) 999-99-99").mask(input);
Inputmask("+7 (999) 999-99-99").mask(input);
Inputmask("+7 (999) 999-99-99").mask(input);
Последствия:
Перед повторным применением маски необходимо удалять предыдущую:
const input = document.querySelector("#phone");
if (input.inputmask) {
input.inputmask.remove();
}
Inputmask("+7 (999) 999-99-99").mask(input);
При работе с динамическими интерфейсами рекомендуется централизованная система инициализации.
Пример безопасной инициализации:
function initPhoneMask(element) {
if (element.inputmask) {
return;
}
Inputmask("+7 (999) 999-99-99").mask(element);
}
Inputmask напрямую связывается с конкретным DOM-элементом. Если элемент удаляется и создаётся заново, маска исчезает.
Типичная ошибка:
container.innerHTML = `
<input id="phone">
`;
После такого обновления новый элемент уже не содержит маску.
Решение — повторная инициализация:
container.innerHTML = `
<input id="phone">
`;
Inputmask("+7 (999) 999-99-99")
.mask(document.querySelector("#phone"));
Особенно актуальна проблема для:
Ошибка возникает при выполнении скрипта до полной загрузки DOM.
Некорректный пример:
Inputmask("+7 (999) 999-99-99")
.mask(document.querySelector("#phone"));
Если элемент ещё не создан, querySelector() возвращает
null.
Решение:
document.addEventListener("DOMContentLoaded", () => {
Inputmask("+7 (999) 999-99-99")
.mask(document.querySelector("#phone"));
});
Либо перенос подключения скрипта перед закрывающим тегом
</body>.
Inputmask работает не со всеми типами полей одинаково корректно.
Проблемный пример:
<input type="number" id="phone">
Маска телефона будет работать нестабильно, потому что браузер сам управляет числовым вводом.
Правильный вариант:
<input type="text" id="phone">
Проблемные типы:
numberemaildatetimeДля большинства масок рекомендуется использовать:
<input type="text">
Автозаполнение браузера может разрушать структуру маски.
Симптомы:
Решение:
<input
type="text"
autocomplete="off"
id="phone">
Иногда дополнительно требуется:
<input
type="text"
autocomplete="new-password">
Некоторые разработчики пытаются использовать слишком длинный placeholder:
Inputmask({
mask: "+7 (999) 999-99-99",
placeholder: "+7 (___) ___-__-__"
});
Это приводит к конфликту внутренней логики Inputmask с пользовательским шаблоном.
Правильный подход:
Inputmask({
mask: "+7 (999) 999-99-99",
placeholder: "_"
});
Либо:
Inputmask({
mask: "+7 (999) 999-99-99",
placeholder: ""
});
Inputmask хранит:
Ошибка:
input.value = "9999999999";
Такое присваивание может обойти внутренние механизмы библиотеки.
Корректный способ:
input.inputmask.setValue("9999999999");
Получение очищенного значения:
const raw = input.inputmask.unmaskedvalue();
Получение отображаемого значения:
const masked = input.value;
При прямом обновлении поля часто нарушается позиция каретки.
Проблемный пример:
input.value = "";
После этого:
Безопасный вариант:
input.inputmask.setValue("");
React постоянно обновляет DOM, а Inputmask напрямую модифицирует поле ввода. Из-за этого появляются конфликты.
Типичные симптомы:
Ошибочный подход:
<input
value={value}
onCha nge={handleChange}
/>
с последующим:
Inputmask("+7 (999) 999-99-99")
.mask(input);
Корректный подход — использование ref.
Пример:
import { useEffect, useRef } from "react";
import Inputmask from "inputmask";
function PhoneInput() {
const ref = useRef(null);
useEffect(() => {
const mask = new Inputmask("+7 (999) 999-99-99");
mask.mask(ref.current);
return () => {
ref.current.inputmask.remove();
};
}, []);
return <input ref={ref} />;
}
Ошибка обычно связана с реактивным обновлением значения.
Проблемный код:
<input v-model="phone">
При изменении phone Vue может перезаписывать данные
быстрее, чем Inputmask обновляет буфер.
Решение — директива:
app.directive("mask", {
mounted(el, binding) {
Inputmask(binding.value).mask(el);
},
unmounted(el) {
if (el.inputmask) {
el.inputmask.remove();
}
}
});
Использование:
<input v-mask="'+7 (999) 999-99-99'">
При работе в SPA это приводит к накоплению обработчиков.
Ошибка:
component.remove();
Без очистки:
Правильный подход:
if (input.inputmask) {
input.inputmask.remove();
}
Распространённая ошибка — попытка валидировать дату только через шаблон.
Проблемный пример:
Inputmask("99/99/9999")
Такая маска допускает:
99/99/999955/44/8888Корректный вариант:
Inputmask({
alias: "datetime",
inputFormat: "dd/mm/yyyy"
});
Многие разработчики пытаются вручную повторить встроенные механизмы.
Проблемный вариант:
Inputmask({
regex: "\\d{4}-\\d{2}-\\d{2}"
});
Более правильное решение:
Inputmask({
alias: "datetime",
inputFormat: "yyyy-mm-dd"
});
Преимущества alias:
Параметр greedy часто понимается неправильно.
Ошибка:
Inputmask({
mask: "9{1,10}",
greedy: true
});
Поле может отображать все десять символов сразу.
Правильный вариант:
Inputmask({
mask: "9{1,10}",
greedy: false
});
Некорректная маска:
"+7 (999) 999-99-99[ доб. 9999]"
При неправильной конфигурации optional-часть может вести себя нестабильно.
Более безопасный вариант:
Inputmask({
mask: "+7 (999) 999-99-99[ доб. 9999]",
greedy: false
});
Некоторые разработчики вручную модифицируют вставляемый текст.
Ошибка:
input.addEventListener("paste", event => {
event.preventDefault();
});
Это ломает внутреннюю систему Inputmask.
Если требуется обработка вставки, используется встроенный механизм:
Inputmask({
onBeforePaste(value) {
return value.replace(/\D/g, "");
}
});
Иногда встречается попытка вызвать несуществующий метод:
input.inputmask.destroy();
В Inputmask используется:
input.inputmask.remove();
Проблема:
<input type="text">
На мобильных устройствах появляется неудобная клавиатура.
Решение:
<input
type="text"
inputmode="numeric">
Для телефона:
<input
type="text"
inputmode="tel">
В старых версиях браузеров события вставки работают нестабильно.
Проблемный код:
document.execCommand("paste");
Современный безопасный подход:
navigator.clipboard.readText();
Но Inputmask лучше работает со встроенными обработчиками без ручного вмешательства.
Ошибка:
const clone = input.cloneNode(true);
Клонируется DOM, но не внутреннее состояние Inputmask.
Решение:
const clone = input.cloneNode(true);
if (clone.inputmask) {
clone.inputmask.remove();
}
Inputmask("+7 (999) 999-99-99").mask(clone);
Некоторые маски считают пустое поле невалидным.
Проблемный пример:
Inputmask({
mask: "+7 (999) 999-99-99"
});
Если поле необязательное:
Inputmask({
mask: "+7 (999) 999-99-99",
clearIncomplete: true
});
Либо:
Inputmask({
mask: "+7 (999) 999-99-99",
nullable: true
});
Нельзя доверять только клиентской маске.
Ошибка архитектуры:
if (input.inputmask.isComplete()) {
save();
}
Маска проверяет лишь формат, но не бизнес-логику.
На сервере всё равно необходима:
Ошибка:
Inputmask({
mask: "+7 (999) 999-99-99",
jitMasking: true
});
Иногда это ухудшает UX:
Подход требует тестирования на реальных сценариях ввода.
Некоторые браузеры теряют обработчики после переключения состояний.
Проблемный сценарий:
input.disabled = true;
input.disabled = false;
Иногда требуется переинициализация:
input.inputmask.remove();
Inputmask("+7 (999) 999-99-99").mask(input);
Чрезмерно сложные шаблоны ухудшают:
Проблемный пример:
"(99|999|9999)-***[AA]{1,4}"
Практически всегда лучше:
Ошибка:
send(input.inputmask.unmaskedvalue());
Некоторые alias могут оставлять служебные символы.
Безопаснее дополнительно очищать данные:
const value = input
.inputmask
.unmaskedvalue()
.replace(/\D/g, "");
Массовая инициализация сотен полей способна вызывать лаги.
Проблемный код:
document.querySelectorAll("input").forEach(el => {
Inputmask().mask(el);
});
Лучшие практики:
Пример:
const phoneMask = new Inputmask("+7 (999) 999-99-99");
document.querySelectorAll(".phone").forEach(el => {
phoneMask.mask(el);
});