Валидация дат в Inputmask строится на разделении синтаксической и
семантической проверки. Маска отвечает за структуру ввода (формат и
допустимые символы), тогда как логическая корректность даты
обеспечивается набором правил, параметров алиаса datetime,
предвалидацией и дополнительными проверками диапазонов.
Ключевая особенность подхода заключается в том, что ввод рассматривается как поток символов, который непрерывно проверяется на соответствие шаблону и ограничениям календаря.
datetime и базовая структура проверкиАлиас datetime является специализированной
конфигурацией, предназначенной для обработки дат и времени. Он задаёт
предопределённые правила:
Пример базовой конфигурации:
Inputmask("datetime", {
inputFormat: "dd/mm/yyyy",
placeholder: "dd/mm/yyyy",
clearIncomplete: true
}).mask(document.querySelector("input"));
На этом уровне Inputmask обеспечивает:
Валидация даты делится на два уровня.
Обеспечивается маской и определяет:
dd/mm/yyyyПример: 32/13/2025 может пройти синтаксически, если
маска не ограничивает диапазоны.
Определяет:
Эта часть реализуется через дополнительные правила
datetime и пользовательские ограничения.
Inputmask применяет диапазонные ограничения на уровне сегментов:
Пример ограничения диапазона дат:
Inputmask("datetime", {
inputFormat: "dd/mm/yyyy",
min: "01/01/2000",
max: "31/12/2030"
}).mask(input);
Диапазон проверяется после заполнения полей, а также частично во время ввода.
Механизм prevalidator используется для ограничения
допустимых промежуточных значений до завершения ввода сегмента.
Он особенно важен для дня и месяца, где допустимые значения зависят от контекста.
Пример логики:
0 разрешён только как промежуточное
состояние3 следующий символ ограничивается в
зависимости от месяцаСемантическая проверка учитывает различия:
Год считается високосным при выполнении условия:
Это влияет на допустимость даты 29 февраля.
Логика:
Параметр inputFormat определяет структуру ввода:
inputFormat: "dd/mm/yyyy"
Возможные варианты:
dd-mm-yyyymm/dd/yyyyyyyy-mm-ddoutputFormat используется для преобразования
значения:
outputFormat: "yyyy-mm-dd"
Это разделяет пользовательский ввод и внутреннее представление данных.
Inputmask использует флаг незавершённости для определения валидности поля.
clearIncomplete: true
Поведение:
isCompleteМетод isComplete определяет, завершён ли ввод согласно
маске:
const mask = new Inputmask("datetime", {
inputFormat: "dd/mm/yyyy"
});
mask.isComplete(input.value);
Критерии завершённости:
oncompleteСрабатывает при полном и корректном заполнении:
Inputmask("datetime", {
inputFormat: "dd/mm/yyyy",
oncomplete: function () {
console.log("Дата введена корректно");
}
}).mask(input);
onincompleteСрабатывает при потере фокуса с незавершённым значением:
onincomplete: function () {
console.log("Дата не завершена");
}
Inputmask позволяет расширять систему через definitions,
что даёт возможность внедрять собственную логику проверки.
Пример расширения:
Inputmask.extendDefinitions({
"D": {
validator: "[0-3]",
cardinality: 1,
prevalidator: null
}
});
Это позволяет:
При вставке строки Inputmask выполняет повторную проверку:
inputFormatОсобенность заключается в том, что вставка проходит через тот же pipeline, что и посимвольный ввод.
31/02/2024 → отклоняется из-за календарной логики00/12/2024 → отклоняется как недопустимый день15/13/2024 → отклоняется как недопустимый месяцВо время ввода допустимы промежуточные состояния:
3/12/029/02/20Эти значения временно принимаются до завершения проверки.
При слишком строгой маске возможна ситуация, когда синтаксис
допускает значение, но семантика его отклоняет. Например, фиксированная
маска 99/99/9999 без дополнительных ограничений позволяет
ввод несуществующих дат, что требует включения логических
валидаторов.
Для сложных сценариев используется комбинированная валидация:
Пример дополнительной проверки:
if (new Date(value) < new Date("2000-01-01")) {
// отклонение значения
}
Валидация дат в Inputmask формируется как многоуровневая система:
datetime обеспечивает базовую семантикуprevalidator ограничивает промежуточные значения