Обработчик onClose в библиотеке Pikaday вызывается в
момент закрытия календаря и предназначен для выполнения логики,
связанной с завершением взаимодействия пользователя с виджетом выбора
даты. Закрытие может происходить как по прямому действию пользователя
(клик вне календаря, повторное нажатие на поле ввода, выбор даты при
определённых настройках), так и программно через вызов методов
экземпляра.
Событие onClose срабатывает после того, как календарь
полностью скрыт и DOM-обновления, связанные с его исчезновением,
завершены. Это важное отличие от событий, которые происходят в момент
выбора даты или изменения состояния.
Закрытие календаря фиксируется в следующих ситуациях:
bound и blur-поведения);hide() или
переключение состояния);hideOnSelect: true);picker.hide() из кода.Обработчик onClose получает экземпляр календаря как
контекст и может принимать дополнительные данные через замыкания или
внешние переменные, так как сама библиотека не передаёт аргументы
напрямую.
Типичная форма объявления:
const picker = new Pikaday({
field: document.getElementById('datepicker'),
onClose: function () {
console.log('Календарь закрыт');
}
});
Внутри обработчика доступен экземпляр через this:
onClose: function () {
this.getDate(); // текущая выбранная дата
this.isVisible(); // состояние видимости
}
thisКонтекст this внутри onClose указывает на
текущий экземпляр Pikaday. Это позволяет обращаться ко всем
публичным методам экземпляра:
getDate() — получение выбранной даты;setDate() — изменение выбранной даты;gotoToday() — переход к текущей дате;destroy() — уничтожение экземпляра;show() и hide() — управление
видимостью;isVisible() — проверка состояния отображения.Использование контекста особенно важно при работе с несколькими инстансами календаря на одной странице.
onClose и onSelectСобытие onSelect вызывается в момент выбора даты
пользователем, тогда как onClose — только при закрытии
интерфейса календаря. Эти события часто используются совместно, но
выполняют разные задачи.
onSelect — реакция на изменение значения;onClose — реакция на завершение взаимодействия.При выборе даты календарь может закрываться автоматически, но это не
означает, что onClose всегда совпадает с
onSelect. Например, при ручном закрытии без выбора даты
onClose сработает, а onSelect — нет.
При интеграции с формами важно фиксировать момент завершения работы с календарём:
onClose: function () {
const date = this.getDate();
if (date) {
document.getElementById('hiddenField').value = date.toISOString();
}
}
Закрытие часто используется как триггер финальной проверки:
onClose: function () {
const date = this.getDate();
if (!date) {
console.warn('Дата не выбрана');
return;
}
validateDateRange(date);
}
onClose удобно использовать для изменения состояния
элементов UI:
onClose: function () {
document.body.classList.remove('calendar-open');
this._input.blur();
}
onCloseПри вызове метода hide() событие onClose
также срабатывает, так как библиотека унифицирует поведение независимо
от источника закрытия.
const picker = new Pikaday({
field: document.getElementById('datepicker'),
onClose: function () {
console.log('Закрытие календаря');
}
});
picker.hide();
Даже при программном управлении интерфейсом логика
onClose остаётся актуальной для синхронизации состояния
приложения.
Если календарь уже скрыт, повторный вызов hide() не
приводит к повторному срабатыванию onClose. Это
предотвращает дублирование логики и повторную обработку событий.
В случае быстрого переключения состояния (например,
show() → hide() подряд) важно учитывать
асинхронность UI-обновлений, чтобы избежать гонок состояния.
При привязанном поле ввода (field) закрытие календаря
часто связано с потерей фокуса. В некоторых конфигурациях это приводит к
цепочке событий:
onClose.Это поведение критично при интеграции с валидацией форм, поскольку порядок событий влияет на итоговое состояние поля.
В сложных интерфейсах часто требуется хранить промежуточное состояние между открытием и закрытием календаря:
let tempState = null;
const picker = new Pikaday({
field: document.getElementById('datepicker'),
onOpen: function () {
tempState = this.getDate();
},
onClose: function () {
const finalDate = this.getDate();
if (finalDate !== tempState) {
console.log('Дата была изменена перед закрытием');
}
}
});
Такой подход позволяет отслеживать изменения, даже если пользователь не подтвердил выбор явно.
onClose не предоставляет аргументов;bound и поведения
input-элемента;Эти особенности делают обработчик завершения более подходящим для фиксации состояния, чем для активного управления интерфейсом.