Событие onChange в Flatpickr является одним из ключевых механизмов реактивного отслеживания изменений выбранной даты. Оно срабатывает каждый раз, когда пользователь изменяет значение календаря: выбирает новую дату, добавляет элемент в режиме multiple, завершает выбор диапазона или очищает поле.
Событие onChange вызывается после того, как внутреннее
состояние выбора даты уже обновлено. Это важный аспект: обработчик
получает уже финальные данные, а не промежуточное состояние UI.
Событие активируется в следующих сценариях:
singlerangemultipleallowInput и
выполняется сброс)setDate (если явно
разрешено триггерить события)Базовая форма события выглядит следующим образом:
onChange: function(selectedDates, dateStr, instance) {
}
Date,
отражающий текущее состояние выбораdateFormatselectedDates всегда возвращается как массив, даже в
режиме single.
Примеры:
single
selectedDates = [Date]
multiple
selectedDates = [Date, Date, Date]
range
selectedDates = [startDate, endDate]
Если диапазон выбран частично, массив содержит один элемент.
Параметр dateStr формируется на основе конфигурации:
dateFormataltInputaltFormatlocale)Пример:
dateStr = "2026-05-31"
или в кастомном формате:
dateStr = "31 May 2026"
В режиме range строка формируется с разделителем:
"2026-05-01 to 2026-05-10"
Разделитель зависит от настройки rangeSeparator.
flatpickr("#date", {
onChange: function(selectedDates, dateStr, instance) {
console.log(selectedDates);
console.log(dateStr);
}
});
В режиме одиночного выбора событие отражает единственное значение массива:
flatpickr("#date", {
mode: "single",
onChange: function(selectedDates) {
const date = selectedDates[0];
console.log(date);
}
});
Особенность заключается в том, что повторный выбор даты перезаписывает предыдущую, но не вызывает накопление значений.
В режиме множественного выбора событие фиксирует каждое добавление или удаление даты.
flatpickr("#date", {
mode: "multiple",
onChange: function(selectedDates, dateStr) {
console.log(selectedDates.length);
console.log(dateStr);
}
});
Поведение:
selectedDates всегда отражает актуальный
наборВ режиме диапазона событие вызывается дважды:
flatpickr("#date", {
mode: "range",
onChange: function(selectedDates) {
if (selectedDates.length === 1) {
console.log("Start:", selectedDates[0]);
} else {
console.log("Range:", selectedDates);
}
}
});
Особенность поведения:
Событие onChange также связано с методами API:
instance.setDate("2026-06-01", true);
Второй аргумент (true) определяет, будет ли вызван
onChange.
instance.clear();
Очистка также инициирует onChange при активной
конфигурации.
Объект instance предоставляет доступ к состоянию
календаря:
onChange: function(selectedDates, dateStr, instance) {
console.log(instance.currentMonth);
console.log(instance.config.mode);
}
Доступные данные:
onChange: function(selectedDates) {
if (selectedDates.length === 0) return;
const date = selectedDates[0];
if (date.getDay() === 0) {
console.log("Воскресенье");
}
}
onChange: function(selectedDates, dateStr) {
document.querySelector("#hidden").value = dateStr;
}
onChange: function(selectedDates) {
const output = document.querySelector("#output");
output.textContent = selectedDates.length;
}
Событие может вызываться несколько раз подряд в следующих ситуациях:
time_enable и изменением времениclickOpens и повторные открытияВнутри Flatpickr существует также событие onSelect,
однако:
onChange ориентирован на изменение значения в
целомonSelect может срабатывать на промежуточные клики в
UIonChange считается более стабильным источником
финального значения.
При включённом времени:
flatpickr("#date", {
enableTime: true,
onChange: function(selectedDates, dateStr) {
console.log(dateStr);
}
});
Событие учитывает изменения:
enableSeconds)Любое изменение времени вызывает повторный onChange.
При частых вызовах события важна минимизация тяжёлых операций:
const output = document.querySelector("#output");
flatpickr("#date", {
onChange: function(selectedDates) {
requestAnimationFrame(() => {
output.textContent = selectedDates.length;
});
}
});
При необходимости можно игнорировать selectedDates и
использовать только dateStr, если форматирование уже
соответствует бизнес-логике:
onChange: function(_, dateStr) {
console.log(dateStr);
}
Если поле очищается вручную или через API:
selectedDates становится пустым массивомdateStr становится пустой строкойonChange: function(selectedDates, dateStr) {
if (!dateStr) {
console.log("очищено");
}
}
При allowInput: true пользователь может вводить значения
вручную, и onChange срабатывает после валидации введённой
строки и её преобразования в дату.
setDate, clear