Хук onBeforeMask в библиотеке Inputmask используется для предварительной обработки значения до применения маски. Этот механизм позволяет модифицировать исходные данные ещё до того, как движок начнёт сопоставлять их с шаблоном.
Основная идея заключается в том, что входное значение может приходить в «сыром» виде: с лишними символами, пробелами, нестандартным форматированием или даже в виде, частично совпадающем с маской. onBeforeMask предоставляет точку перехвата, где это значение можно нормализовать.
onBeforeMask: function (value, opts) {
return value;
}
value — исходная строка, которая будет подставлена в
input или передана программно.opts — объект конфигурации текущей маски, содержащий
параметры, alias и дополнительные настройки.Возвращаемое значение:
undefined или null поведение
зависит от версии, но обычно используется исходное значение без
изменений.Порядок обработки данных:
Таким образом, onBeforeMask влияет на внутреннее представление данных до форматирования, но не затрагивает уже отмаскированный результат.
Нормализация входных данных
Часто данные приходят с внешних источников, где форматирование отличается:
Inputmask({
mask: "+7 (999) 999-99-99",
onBeforeMask: function (value) {
return value.replace(/[^\d+]/g, "");
}
}).mask(input);
Здесь удаляются все символы, кроме цифр и плюса, чтобы входное значение стало пригодным для дальнейшей обработки.
Приведение даты к унифицированному виду
Inputmask("99-99-9999", {
onBeforeMask: function (value) {
return value.replace(/\./g, "-");
}
});
Если дата приходит в формате dd.mm.yyyy, она
автоматически приводится к dd-mm-yyyy.
Предобработка телефонных номеров
onBeforeMask: function (value) {
if (value.startsWith("8")) {
return value.replace(/^8/, "+7");
}
return value;
}
Позволяет унифицировать национальные форматы телефонов до международного стандарта.
Inputmask отделяет:
onBeforeMask воздействует только на первый этап, изменяя raw value до попадания в буфер обработки.
Хук onBeforePaste применяется в момент вставки данных из буфера обмена. Он позволяет перехватить вставляемую строку и модифицировать её до того, как Inputmask начнёт её анализировать и применять маску.
Это особенно важно, поскольку данные из буфера почти всегда имеют нестандартизированный формат: пробелы, символы-разделители, HTML-артефакты, копирование из таблиц или сторонних систем.
onBeforePaste: function (pastedValue, opts) {
return pastedValue;
}
pastedValue — строка, вставленная пользователем.opts — конфигурация маски и текущего инстанса
Inputmask.Возвращаемое значение:
Удаление лишних символов из вставки
Inputmask({
mask: "9999 9999 9999 9999",
onBeforePaste: function (value) {
return value.replace(/\s+/g, "");
}
}).mask(input);
При вставке номера карты вида 1234 5678 9012 3456
пробелы удаляются до обработки.
Очистка HTML-формата
onBeforePaste: function (value) {
return value.replace(/<[^>]*>/g, "");
}
Используется при копировании данных из HTML-источников, где могут попадать теги.
Унификация телефонных номеров при вставке
onBeforePaste: function (value) {
return value
.replace(/[^\d+]/g, "")
.replace(/^8/, "+7");
}
Позволяет сразу привести вставленный номер к единому формату без дополнительного ввода пользователя.
Несмотря на схожесть назначения, эти хуки работают в разных контекстах:
| Хук | Контекст | Основная задача |
|---|---|---|
| onBeforeMask | Инициализация и установка значения | Подготовка исходных данных |
| onBeforePaste | Вставка из буфера обмена | Очистка вставляемых данных |
Ключевое различие — источник данных: внешний программный ввод против пользовательской вставки.
В сложных сценариях оба хука применяются совместно:
Inputmask({
mask: "+7 (999) 999-99-99",
onBeforeMask: function (value) {
return value.replace(/[^\d+]/g, "");
},
onBeforePaste: function (value) {
return value
.replace(/\s/g, "")
.replace(/^8/, "+7");
}
}).mask(input);
В таком варианте:
Оба хука являются критическими точками перехвата данных. Неправильная логика в них может привести к:
Поэтому преобразования в этих хуках должны оставаться детерминированными и минимальными по сложности, без побочных эффектов.