VIN (Vehicle Identification Number) представляет собой строго стандартизированную последовательность из 17 символов, используемую для уникальной идентификации транспортного средства. В контексте веб-форм VIN-номер требует особого подхода к маскированию ввода, поскольку формат включает жёсткие ограничения на допустимые символы, фиксированную длину и отсутствие визуальных разделителей. Библиотека Inputmask в JavaScript предоставляет инструменты для построения таких ограничений через маски, пользовательские валидаторы и правила преобразования ввода.
VIN всегда состоит из 17 символов без пробелов и разделителей. В состав допускаются:
Исключение букв связано с их визуальной схожестью с цифрами 1 и 0, что снижает вероятность ошибок при ручном вводе.
Ключевые ограничения:
Эти свойства делают VIN типичным кандидатом для применения Inputmask с кастомной маской и строгой валидацией символов.
В Inputmask отсутствует встроенный alias для VIN, поэтому применяется пользовательская маска с определением допустимых символов.
Наиболее прямолинейная реализация использует универсальный символ с кастомной проверкой:
Inputmask({
mask: "*****************",
definitions: {
"*": {
validator: "[A-HJ-NPR-Z0-9]",
casing: "upper"
}
},
placeholder: "",
showMaskOnHover: false,
showMaskOnFocus: false,
clearIncomplete: true
}).mask(document.querySelector("#vin"));
В данной конфигурации:
mask: "*****************" задаёт ровно 17 позиций
вводаdefinitions переопределяет поведение символа
*validator ограничивает набор допустимых символов
регулярным выражениемcasing: "upper" автоматически приводит ввод к верхнему
региструclearIncomplete очищает незавершённое значение при
потере фокусаРегулярное выражение [A-HJ-NPR-Z0-9] исключает I, O и Q,
сохраняя соответствие стандарту VIN.
Для VIN удобно применять режим regex, который полностью
заменяет маску регулярным выражением:
Inputmask({
regex: "[A-HJ-NPR-Z0-9]{17}",
casing: "upper",
placeholder: "",
clearIncomplete: true
}).mask(document.querySelector("#vin"));
Данный подход обеспечивает:
Регулярный режим особенно полезен при серверной синхронизации правил валидации, когда формат уже описан одной регулярной строкой.
VIN всегда хранится в верхнем регистре. В Inputmask это достигается
через свойство casing.
Дополнительно может применяться обработка событий:
Inputmask({
mask: "*****************",
definitions: {
"*": {
validator: "[A-Za-z0-9]",
casing: "upper"
}
}
}).mask("#vin");
В некоторых сценариях требуется дополнительная нормализация значения после вставки из буфера обмена, поскольку Inputmask не всегда полностью контролирует формат внешнего ввода.
VIN часто вводится через копирование из документов или систем учета. В таких случаях важно нормализовать входящие данные.
Inputmask предоставляет хуки событий:
Inputmask({
mask: "*****************",
definitions: {
"*": {
validator: "[A-HJ-NPR-Z0-9]",
casing: "upper"
}
},
onBeforePaste: function (pastedValue) {
return pastedValue.toUpperCase().replace(/[^A-HJ-NPR-Z0-9]/g, "");
}
}).mask("#vin");
Логика обработки:
Такая обработка обеспечивает корректную интеграцию с внешними источниками данных.
VIN требует строгого соответствия длине 17 символов. Inputmask
предоставляет механизм isComplete, который используется для
проверки заполненности поля.
const vinInput = document.querySelector("#vin");
const im = Inputmask({
mask: "*****************",
definitions: {
"*": {
validator: "[A-HJ-NPR-Z0-9]",
casing: "upper"
}
},
clearIncomplete: true
}).mask(vinInput);
function validateVIN() {
const instance = vinInput.inputmask;
const value = instance ? instance.unmaskedvalue() : "";
const isValid = value.length === 17;
}
Метод unmaskedvalue() возвращает значение без
дополнительной обработки, что позволяет выполнять финальную
проверку.
Для более строгой логики можно внедрять кастомную проверку отдельных
символов через функцию validator.
definitions: {
"*": {
validator: function (ch) {
const allowed = /^[A-HJ-NPR-Z0-9]$/;
return allowed.test(ch);
},
casing: "upper"
}
}
Такой подход позволяет расширять правила, например:
Inputmask обеспечивает синтаксическую корректность, но не семантическую проверку VIN. Для расширенной проверки часто добавляется дополнительный слой логики:
Пример интеграции:
function isVINFormatValid(vin) {
return /^[A-HJ-NPR-Z0-9]{17}$/.test(vin);
}
function isVINComplete(input) {
const value = input.inputmask.unmaskedvalue();
return value.length === 17 && isVINFormatValid(value);
}
Для VIN часто отключается визуальный шаблон, поскольку фиксированная длина и однородная структура не требуют подсказок по разделению:
Inputmask({
mask: "*****************",
placeholder: "",
showMaskOnHover: false,
showMaskOnFocus: false
}).mask("#vin");
Отсутствие placeholder уменьшает визуальный шум и делает поле более нейтральным, что важно для системного ввода данных.
Inputmask позволяет программно устанавливать VIN:
const el = document.querySelector("#vin");
const im = Inputmask({
mask: "*****************",
definitions: {
"*": {
validator: "[A-HJ-NPR-Z0-9]",
casing: "upper"
}
}
}).mask(el);
el.inputmask.setValue("1HGCM82633A004352");
Метод setValue автоматически применяет маску и
нормализацию, включая преобразование регистра.
При отправке формы важно извлекать именно очищенное значение:
form.addEventListener("submit", function () {
const vin = vinInput.inputmask.unmaskedvalue();
if (vin.length !== 17) {
event.preventDefault();
}
});
Такой подход исключает влияние маски на серверную обработку и обеспечивает передачу чистых данных.
При использовании clearIncomplete: true незавершённые
VIN автоматически очищаются, что снижает риск сохранения некорректных
значений. Альтернативный режим предполагает сохранение частичного ввода,
но требует внешней валидации.
Inputmask({
mask: "*****************",
clearIncomplete: true
}).mask("#vin");
В сложных интерфейсах VIN может вводиться в составе комбинированных форм, где Inputmask применяется совместно с другими полями:
В таких случаях маска остаётся единым 17-символьным слоем, а структурирование выполняется на уровне логики приложения, а не Inputmask.
Типовая конфигурация VIN-маски в Inputmask сводится к следующим принципам:
[A-HJ-NPR-Z0-9]unmaskedvalue()Такая комбинация позволяет обеспечить соответствие международному стандарту VIN при сохранении контроля над пользовательским вводом на уровне интерфейса.