В библиотеке Pikaday ключевым механизмом реакции на действия
пользователя является обработчик onSelect. Он вызывается
каждый раз, когда пользователь выбирает дату в календаре. Это событие
является центральной точкой интеграции календаря с логикой приложения,
поскольку именно здесь фиксируется финальный выбор значения.
onSelectОбработчик onSelect вызывается после того, как
пользователь:
Важно, что onSelect срабатывает только при установке
конкретной даты. Переключение месяцев, годов или навигация по календарю
не вызывает этот обработчик.
Стандартная форма объявления:
const picker = new Pikaday({
field: document.getElementById('date'),
onSelect: function(date) {
console.log(date);
}
});
Аргумент date представляет собой объект типа
Date, содержащий выбранную дату в локальном часовом поясе
браузера.
Внутри onSelect контекст this ссылается на
экземпляр пикера. Это позволяет обращаться ко всем внутренним методам и
свойствам календаря:
onSelect: function(date) {
console.log(this.getDate());
console.log(this.toString());
}
Через this доступны методы:
getDate() — получение текущей выбранной даты;toString() — строковое представление даты;setDate() — программная установка значения;gotoDate() — переход к указанной дате.Частое применение onSelect связано с синхронизацией
выбранной даты с input-полем:
const picker = new Pikaday({
field: document.getElementById('date'),
onSelect: function(date) {
this._o.field.value = this.toString('YYYY-MM-DD');
}
});
Здесь используется внутренний объект _o, содержащий
настройки экземпляра, включая DOM-элемент поля ввода.
По умолчанию дата возвращается как объект Date, но часто
требуется преобразование в строку. Pikaday поддерживает форматирование
через метод toString(format):
onSelect: function(date) {
const formatted = this.toString('DD.MM.YYYY');
this._o.field.value = formatted;
}
Использование форматов позволяет адаптировать вывод под локальные стандарты или требования серверного API.
onSelect может делегировать обработку внешним функциям,
что повышает модульность:
function handleDateChange(date, picker) {
const value = picker.toString('YYYY-MM-DD');
document.querySelector('#output').textContent = value;
}
const picker = new Pikaday({
field: document.getElementById('date'),
onSelect: function(date) {
handleDateChange(date, this);
}
});
Такой подход позволяет отделить UI-логику от логики обработки данных.
Если пользователь выбирает уже активную дату, повторного вызова
onSelect не происходит. Это важно учитывать при реализации
побочных эффектов, таких как запросы к серверу или обновление состояния
приложения.
В расширенных конфигурациях, где реализуется выбор диапазона дат,
onSelect может вызываться на каждом шаге выбора:
В таких сценариях обработчик должен учитывать состояние выбора, а не только конечное значение.
onSelectПри использовании setDate() поведение
onSelect зависит от передаваемых параметров:
picker.setDate(new Date());
Это поведение предотвращает лишние вызовы логики обновления.
onSelect часто используется для немедленной валидации
формы:
onSelect: function(date) {
const isValid = date > new Date();
document.querySelector('#error').style.display = isValid ? 'none' : 'block';
}
Такой подход позволяет реагировать на выбор пользователя без ожидания отправки формы.
Хотя onSelect реализован на уровне библиотеки и не
зависит напрямую от браузерных событий, поведение выбора может
незначительно различаться в зависимости от:
Тем не менее сам механизм вызова обработчика остаётся стабильным и унифицированным.
При использовании кастомных шаблонов календаря onSelect
остаётся центральной точкой синхронизации состояния. Независимо от того,
как отрисованы дни, событие выбора всегда приводит к передаче
Date в обработчик, обеспечивая единообразие поведения.
onSelect: function(date) {
updateCustomCalendarState(date);
}
Это позволяет отделять визуальный слой от логики управления датами.
После вызова onSelect календарь обновляет внутреннее
состояние:
Таким образом, onSelect не только уведомляет внешнюю
логику, но и завершает цикл изменения состояния внутри календаря.