В библиотеке Pikaday обработчик onOpen представляет
собой один из ключевых callback-механизмов жизненного цикла календаря.
Он вызывается в момент, когда календарь становится видимым, то есть
после инициализации показа интерфейса выбора даты, но до завершения
пользовательского взаимодействия с открытым состоянием.
onOpen в жизненном цикле компонентаПоведение календаря можно условно разделить на несколько этапов:
onOpen относится к фазе открытия и срабатывает сразу
после того, как календарь переходит в состояние отображения. В отличие
от onSelect, который связан с выбором даты, или
onClose, который вызывается при закрытии,
onOpen фиксирует исключительно момент активации
интерфейса.
Обработчик задаётся через конфигурационный объект при создании экземпляра:
const picker = new Pikaday({
field: document.getElementById('date'),
onOpen: function () {
console.log('calendar opened');
}
});
В момент вызова this внутри функции указывает на
экземпляр пикера. Это позволяет получать доступ к внутреннему состоянию
компонента:
onOpen вызывается строго до onDraw, если
перерисовка календаря происходит одновременно с открытием. Типичный
порядок выглядит следующим образом:
show() или фокус на поле ввода;onOpen;onDraw);Такое разделение позволяет использовать onOpen для
подготовки состояния до того, как пользователь увидит полностью
отрисованный интерфейс.
При каждом открытии календаря обработчик вызывается повторно. Это означает, что:
onOpen должна быть идемпотентной;Если календарь открыт, закрыт и открыт снова, последовательность
вызовов onOpen повторяется полностью.
Перед отображением календаря часто требуется обновить диапазоны дат или ограничения:
onOpen: function () {
this.setMinDate(new Date(2020, 0, 1));
this.setMaxDate(new Date());
}
В подобных сценариях onOpen используется как точка
синхронизации состояния перед визуализацией.
При повторном открытии может потребоваться сброс промежуточных значений:
onOpen: function () {
this.gotoToday();
}
Это позволяет возвращать календарь к предсказуемому состоянию при каждом открытии.
Открытие календаря может сопровождаться изменением интерфейса формы:
onOpen: function () {
document.body.classList.add('calendar-active');
}
Такой подход часто используется для управления слоями перекрытия, затемнения фона или блокировки скролла.
Во время выполнения onOpen DOM календаря уже добавлен в
документ, но возможны нюансы рендеринга:
Поэтому любые операции, зависящие от layout-метрик
(offsetHeight, getBoundingClientRect), могут
требовать учёта временного окна между onOpen и
onDraw.
show и hideМетод show() инициирует процесс открытия, в результате
которого вызывается onOpen. Однако прямой вызов
onOpen невозможен через API — он всегда привязан к
жизненному циклу.
При этом:
show() → вызывает onOpen;hide() → вызывает onClose;show() после hide() снова
активирует onOpen.Такое разделение обеспечивает стабильность поведения независимо от способа открытия (клик по input, программный вызов, фокус).
this и
доступ к APIВнутри обработчика доступен полный API экземпляра:
getDate();setDate();gotoDate();setMinDate(), setMaxDate();destroy().Пример доступа к текущему состоянию:
onOpen: function () {
const selected = this.getDate();
console.log(selected);
}
Контекст остаётся стабильным на протяжении всего жизненного цикла экземпляра.
Функция onOpen не получает аргументов. Все данные
извлекаются через this.
Обработчик выполняется синхронно в момент открытия. Долгие операции внутри него могут:
Изменения DOM внутри onOpen могут быть перезаписаны
последующим onDraw, поэтому критичные модификации
интерфейса должны учитывать повторную отрисовку.
При наличии нескольких календарей каждый экземпляр вызывает
собственный onOpen. Перекрёстного влияния между
экземплярами нет, если не используется общая внешняя логика.
new Pikaday({
field: input1,
onOpen: function () {
console.log('first opened');
}
});
new Pikaday({
field: input2,
onOpen: function () {
console.log('second opened');
}
});
После вызова destroy() все обработчики, включая
onOpen, перестают активироваться. Попытка открытия
календаря после уничтожения не приводит к выполнению
callback-функции.