В библиотеке Pikaday параметр onClose относится к
событиям жизненного цикла календаря и вызывается в момент закрытия
виджета выбора даты. Он предоставляет точку расширения, через которую
можно синхронизировать состояние интерфейса, выполнять валидацию,
инициировать побочные эффекты или связывать календарь с внешними
компонентами формы.
onClose определяется как функция обратного вызова:
onClose: function() {
}
Функция вызывается каждый раз, когда календарь перестаёт быть видимым. Закрытие может происходить по следующим причинам:
Важно учитывать, что onClose не связан напрямую с
выбором даты. Он срабатывает именно на событие скрытия UI, независимо от
того, была ли изменена дата.
В момент вызова onClose контекст this
внутри функции указывает на экземпляр Pikaday. Это позволяет получать
доступ к состоянию календаря:
var picker = new Pikaday({
field: document.getElementById('date'),
onClose: function() {
console.log(this.getDate());
}
});
Методы экземпляра, доступные в этом контексте:
getDate() — текущая выбранная дата;getMoment() — объект moment.js, если используется
интеграция;getMaxDate() и getMinDate() — границы
диапазона;isVisible() — состояние отображения.Использование контекста позволяет строить логики, завязанные на финальное состояние календаря после закрытия.
Часто onClose применяется для обновления интерфейса
формы после завершения работы календаря:
onClose: function() {
document.getElementById('status').textContent = 'Календарь закрыт';
}
Это позволяет фиксировать момент завершения взаимодействия.
Закрытие календаря является удобной точкой для финальной проверки корректности выбранной даты:
onClose: function() {
const date = this.getDate();
if (date && date.getFullYear() < 2000) {
alert('Дата вне допустимого диапазона');
this.setDate(null);
}
}
Здесь логика выполняется один раз после завершения выбора, а не на каждом изменении.
onClose часто используется для триггера отправки
данных:
onClose: function() {
const form = document.getElementById('form');
if (this.getDate()) {
form.submit();
}
}
Такой подход уменьшает количество пользовательских действий и фиксирует момент завершённого выбора.
Ключевое различие между onClose и onSelect
заключается в моменте вызова:
onSelect вызывается при выборе даты;onClose вызывается при закрытии календаря.onSelect: function(date) {
console.log('Выбрана дата:', date);
},
onClose: function() {
console.log('Календарь закрыт');
}
Эти два события часто используются совместно, но решают разные задачи: первое фиксирует изменение данных, второе — завершение взаимодействия.
При вызове метода hide() календаря onClose
также активируется:
picker.hide();
Это означает, что любые программные сценарии закрытия считаются
эквивалентными пользовательскому закрытию. Следовательно, логика внутри
onClose должна быть устойчивой к отсутствию
пользовательского ввода в момент вызова.
onClose может пересекаться по времени с потерей фокуса
поля ввода. Однако важно различать:
blur) относится к DOM-элементу;onClose относится к состоянию календаря.В некоторых конфигурациях blur может инициировать
закрытие календаря, что косвенно приводит к вызову
onClose.
field.addEventListener('blur', function() {
console.log('Поле потеряло фокус');
});
При этом порядок вызовов зависит от внутренней реализации и может варьироваться.
При некоторых сценариях onClose может вызываться
несколько раз подряд, например:
Поэтому внутри обработчика не рекомендуется хранить критичное состояние без проверок:
onClose: function() {
if (this._alreadyClosed) return;
this._alreadyClosed = true;
console.log('Закрытие обработано один раз');
}
При использовании асинхронных действий внутри onClose
важно учитывать, что календарь уже считается завершившим
взаимодействие:
onClose: function() {
const value = this.getDate();
setTimeout(() => {
console.log('Отложенная обработка:', value);
}, 0);
}
Это позволяет безопасно отделять UI-событие от фоновой обработки данных.
onClose не предоставляет аргументов.Построение логики только на onClose приводит к потере
информации о факте выбора значения, поэтому он чаще выступает
завершающим этапом цепочки взаимодействий.
В контексте жизненного цикла Pikaday обработчик onClose
завершает активную фазу взаимодействия пользователя с календарём. Он
логически следует после:
И фиксирует переход к состоянию «неактивен / скрыт», что делает его удобной точкой интеграции с внешними системами управления формами и интерфейсами.