Библиотека Pikaday построена вокруг событийной модели, позволяющей отслеживать ключевые этапы взаимодействия пользователя с календарём. События формируют основной механизм интеграции datepicker в бизнес-логику приложения: через них осуществляется синхронизация состояния, валидация дат, обновление интерфейса и управление связанными компонентами.
Событийная структура в Pikaday делится на две категории: жизненный цикл экземпляра календаря и события выбора/изменения даты. Каждая категория отражает отдельный слой поведения компонента и имеет собственные точки расширения.
Pikaday не использует сложную систему кастомного EventEmitter, как в крупных фреймворках. Вместо этого применяется простая модель: колбэки передаются в конфигурации экземпляра и вызываются в строго определённые моменты жизненного цикла.
Ключевая особенность:
Пример общей структуры инициализации:
const picker = new Pikaday({
field: document.getElementById('input'),
onSelect: function(date) {
console.log(date);
},
onOpen: function() {},
onClose: function() {},
onDraw: function() {}
});
onSelect — центральное событие библиотеки. Оно
срабатывает при выборе даты пользователем или при установке даты
программно через API.
Событие вызывается:
setDateВ callback передаётся:
Date (выбранная дата)onSelect: function(date) {
console.log(date.toISOString());
}
onOpen вызывается в момент, когда календарь становится
видимым.
show()isVisible → trueonOpen: function() {
console.log('Календарь открыт');
}
Событие не принимает параметров, так как состояние экземпляра уже доступно через API объекта.
onClose срабатывает при скрытии календаря и завершении
взаимодействия с ним.
hide()onClose: function() {
console.log('Календарь закрыт');
}
onDraw вызывается при каждом рендере календарной
сетки.
gotoMonth,
gotoYear)onDraw: function() {
console.log('Календарь перерисован');
}
Поскольку onDraw может срабатывать многократно в
короткий промежуток времени, внутри него не рекомендуется выполнять:
Хотя Pikaday не выделяет отдельное событие для всех программных
изменений, такие изменения всё равно проходят через
onSelect.
Ключевые методы, инициирующие событие:
setDate(date)setMoment(moment) (если используется Moment.js
интеграция)gotoDate(date) (не всегда вызывает
onSelect, зависит от реализации)При выборе даты через интерфейс последовательность событий обычно выглядит следующим образом:
onSelectonDraw)onCloseПри открытии:
onDrawonOpenКаждое событие тесно связано с внутренними полями объекта календаря:
isVisible → onOpen,
onClosecurrentDate → onSelectviewDate → onDrawСостояние экземпляра обновляется до вызова колбэков, что гарантирует консистентность данных внутри обработчиков.
При работе через API важно учитывать различие между пользовательскими и программными изменениями.
picker.setDate(new Date());
onSelectonDrawpicker.gotoMonth(5);
onDrawonSelectСистема событий Pikaday построена на принципах:
Такая архитектура снижает сложность интеграции и исключает необходимость управления подписками и отписками, но ограничивает расширяемость событийной модели.
onSelect используется для обновления связанных
полей:
onSelect: function(date) {
hiddenInput.value = date.toISOString();
}
onOpen: function() {
overlay.classList.add('active');
}
onDraw: function() {
updateDisabledDays();
}
Такая модель делает поведение предсказуемым, но ограничивает возможность глубокого вмешательства в логику компонента.