Обработчик onincomplete в библиотеке Inputmask
вызывается в момент, когда поле теряет фокус, но введённое значение не
соответствует полностью заполненной маске. Это один из ключевых
механизмов контроля корректности ввода на стороне интерфейса.
Событие особенно полезно в следующих сценариях:
onincomplete относится к набору callback-обработчиков
библиотеки и работает совместно с системой проверки полноты маски.
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
console.log("Маска заполнена не полностью");
}
}).mask("#phone");
Если пользователь введёт:
+7 (777) 12
и затем покинет поле, обработчик будет вызван.
onincompleteОбработчик активируется при соблюдении нескольких условий одновременно:
blur);Пример:
Inputmask({
mask: "99/99/9999",
onincomplete: function () {
console.log("Дата введена не полностью");
}
}).mask("#date");
| Ввод | Результат |
|---|---|
12/05/2025 |
обработчик НЕ вызывается |
12/05/ |
вызывается |
12/ |
вызывается |
| пустое поле | зависит от настроек |
onincomplete от oncompleteОчень важно понимать различие между этими обработчиками.
oncompleteСрабатывает, когда маска полностью заполнена.
oncomplete: function () {
console.log("Заполнение завершено");
}
onincompleteСрабатывает, когда ввод остался незавершённым.
onincomplete: function () {
console.log("Заполнение не завершено");
}
| Ситуация | oncomplete | onincomplete |
|---|---|---|
| Маска полностью заполнена | Да | Нет |
| Маска заполнена частично | Нет | Да |
| Пользователь ушёл из поля | Возможен вызов | Возможен вызов |
| Значение соответствует шаблону | Да | Нет |
onincomplete получает контекст текущего input-элемента
через this.
Пример:
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
console.log(this.value);
}
}).mask("#phone");
При неполном вводе:
+7 (777) 1
в консоль попадёт текущее содержимое поля.
Часто требуется изменить оформление поля.
Inputmask({
mask: "9999 9999 9999 9999",
onincomplete: function () {
this.style.border = "2px solid red";
}
}).mask("#card");
После потери фокуса поле станет визуально отмеченным как некорректное.
Один из наиболее распространённых сценариев — отображение ошибок формы.
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
document.querySelector("#error").textContent =
"Введите номер телефона полностью";
}
}).mask("#phone");
Обычно onincomplete комбинируют с
oncomplete.
Inputmask({
mask: "+7 (999) 999-99-99",
oncomplete: function () {
document.querySelector("#error").textContent = "";
},
onincomplete: function () {
document.querySelector("#error").textContent =
"Телефон введён не полностью";
}
}).mask("#phone");
Более правильный подход — управление классами вместо прямого изменения стилей.
Inputmask({
mask: "99/99/9999",
onincomplete: function () {
this.classList.add("invalid");
},
oncomplete: function () {
this.classList.remove("invalid");
}
}).mask("#date");
CSS:
.invalid {
border-color: red;
background: #ffe5e5;
}
Типичный пример использования.
Inputmask({
mask: "+1 (999) 999-9999",
onincomplete: function () {
alert("Введите телефон полностью");
}
}).mask("#phone");
Если пользователь введёт:
+1 (555) 12
то после потери фокуса появится сообщение.
onincomplete учитывает необязательные сегменты.
Пример:
Inputmask({
mask: "(999) 999-9999[ x99999]",
onincomplete: function () {
console.log("Основная часть заполнена не полностью");
}
}).mask("#phone");
Если заполнена только обязательная часть:
(555) 123-4567
обработчик не вызовется.
Но если обязательная часть незавершена:
(555) 12
onincomplete сработает.
clearIncompleteПараметр clearIncomplete автоматически очищает поле при
незавершённом вводе.
Inputmask({
mask: "99/99/9999",
clearIncomplete: true,
onincomplete: function () {
console.log("Поле будет очищено");
}
}).mask("#date");
blur;onincomplete;Иногда неполный ввод запрещает отправку запроса.
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
window.phoneReady = false;
},
oncomplete: function () {
window.phoneReady = true;
}
}).mask("#phone");
Позже:
form.addEventListener("submit", function (e) {
if (!window.phoneReady) {
e.preventDefault();
}
});
document.querySelectorAll(".phone").forEach(function (element) {
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
this.classList.add("error");
},
oncomplete: function () {
this.classList.remove("error");
}
}).mask(element);
});
Стрелочные функции использовать не рекомендуется.
Неправильно:
Inputmask({
mask: "99/99/9999",
onincomplete: () => {
console.log(this);
}
}).mask("#date");
Здесь this не будет ссылаться на input.
Правильно:
Inputmask({
mask: "99/99/9999",
onincomplete: function () {
console.log(this);
}
}).mask("#date");
Через DOM-элемент можно получить экземпляр маски.
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
console.log(this.inputmask);
}
}).mask("#phone");
Inputmask({
mask: "99/99/9999",
onincomplete: function () {
const error = document.querySelector("#date-error");
error.textContent =
"Дата должна содержать день, месяц и год";
}
}).mask("#date");
isCompleteВнутри обработчика можно вручную проверять состояние маски.
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
console.log(
this.inputmask.isComplete()
);
}
}).mask("#phone");
Результат:
false
Поведение onincomplete тесно связано с
placeholder-символами.
Inputmask({
mask: "99/99/9999",
placeholder: "_",
onincomplete: function () {
console.log(this.value);
}
}).mask("#date");
При вводе:
12/05/____
маска считается незавершённой.
Inputmask({
mask: [
"+7 (999) 999-99-99",
"+1 (999) 999-9999"
],
onincomplete: function () {
console.log("Номер введён не полностью");
}
}).mask("#phone");
Обработчик будет учитывать активную маску, выбранную библиотекой автоматически.
const form = document.querySelector("#form");
form.addEventListener("submit", function (e) {
const phone = document.querySelector("#phone");
if (!phone.inputmask.isComplete()) {
e.preventDefault();
phone.focus();
}
});
Вместе с onincomplete:
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
this.classList.add("invalid");
}
}).mask("#phone");
Inputmask({
alias: "email",
onincomplete: function () {
console.log("Email заполнен не полностью");
}
}).mask("#email");
Пример неполного ввода:
test@
useEffect(() => {
Inputmask({
mask: "+7 (999) 999-99-99",
onincomplete: function () {
console.log("Ошибка телефона");
}
}).mask(inputRef.current);
}, []);
mounted() {
Inputmask({
mask: "99/99/9999",
onincomplete: function () {
console.log("Неполная дата");
}
}).mask(this.$refs.date);
}
onincomplete: () => {}
Теряется контекст this.
onincomplete обычно вызывается после потери фокуса.
Пока поле активно, callback может не срабатывать.
onclearedoncleared вызывается при очистке поля, а не при неполном
вводе.
oncleared: function () {
console.log("Поле очищено");
}
Необязательные блоки не влияют на полноту маски.
<input id="phone">
<div id="phone-error"></div>
Inputmask({
mask: "+7 (999) 999-99-99",
oncomplete: function () {
this.classList.remove("invalid");
document.querySelector("#phone-error")
.textContent = "";
},
onincomplete: function () {
this.classList.add("invalid");
document.querySelector("#phone-error")
.textContent =
"Введите номер телефона полностью";
}
}).mask("#phone");
.invalid {
border: 2px solid red;
}
onincomplete значительно улучшает пользовательский
интерфейс:
Особенно полезен обработчик в: