Поведение Flatpickr определяется тем, какой DOM-элемент передан в
качестве цели и как настроены параметры инициализации. Библиотека не
ограничивается только <input> — календарь может быть
привязан к любому элементу страницы, который способен выступать
триггером открытия или контейнером для отображения интерфейса.
Flatpickr принимает как строковый селектор, так и непосредственно DOM-узел:
flatpickr("#date", {});
const el = document.querySelector(".my-element");
flatpickr(el, {});
Во втором варианте появляется полный контроль над тем, к чему именно привязывается экземпляр. Это важно при динамической генерации интерфейсов, работе с компонентными системами и кастомными виджетами.
При привязке к неинпут-элементам библиотека использует внутренний механизм событий клика для открытия календаря и не пытается автоматически управлять значением, если это не поле ввода.
Любой кликабельный элемент может выступать триггером:
<div class="date-box">Выбрать дату</div>
flatpickr(".date-box", {
onChange: function(selectedDates, dateStr) {
document.querySelector(".date-box").textContent = dateStr;
}
});
В этом случае Flatpickr не подменяет поведение элемента, а лишь добавляет логику выбора даты. Отображение результата полностью контролируется разработчиком.
Такой подход применяется для UI-компонентов, где поле ввода не должно быть частью интерфейса, например:
При использовании <input> можно запретить ввод
вручную и оставить только выбор через календарь:
flatpickr("#date", {
allowInput: false
});
В связке с произвольным элементом часто применяется более строгий контроль:
<input id="hidden-date" type="text" hidden>
<div class="trigger">Открыть календарь</div>
const fp = flatpickr("#hidden-date", {
clickOpens: false
});
document.querySelector(".trigger").addEventListener("click", () => {
fp.open();
});
Здесь календарь полностью отвязан от input и управляется внешним элементом через API.
Flatpickr предоставляет программный интерфейс управления:
const fp = flatpickr("#date", {
clickOpens: false
});
fp.open();
fp.close();
Метод open() позволяет привязать открытие календаря к
любому событию:
button.addEventListener("mouseenter", () => fp.open());
icon.addEventListener("click", () => fp.open());
Такой подход используется для сложных интерфейсов, где открытие календаря зависит от контекста, а не только от клика по самому полю.
Часто календарь должен открываться при клике на иконку внутри блока:
<div class="date-wrapper">
<input id="date" type="text">
<span class="icon">?</span>
</div>
const fp = flatpickr("#date", {
clickOpens: false
});
document.querySelector(".icon").addEventListener("click", () => {
fp.open();
});
Здесь элемент input остаётся логическим хранилищем данных, а визуальный триггер полностью отделён.
Опция wrap позволяет привязать Flatpickr к контейнеру и
автоматически обрабатывать вложенные элементы с атрибутами
data-input, data-open,
data-close.
<div class="date-wrapper" data-input>
<input type="text">
<span class="calendar-btn" data-open>Открыть</span>
<span class="clear-btn" data-clear>×</span>
</div>
flatpickr(".date-wrapper", {
wrap: true
});
В этом режиме библиотека сама анализирует структуру DOM и связывает действия с нужными элементами.
Используются стандартные data-атрибуты:
data-input — основной inputdata-open — открытие календаряdata-close — закрытиеdata-clear — очистка значенияЭто особенно удобно при создании переиспользуемых UI-компонентов без ручного навешивания событий.
Flatpickr может быть привязан даже к элементам, не предназначенным для ввода:
<span class="date-label">Дата не выбрана</span>
const label = document.querySelector(".date-label");
const fp = flatpickr(label, {
clickOpens: true,
onChange: function(_, dateStr) {
label.textContent = dateStr;
}
});
В этом случае библиотека добавляет обработчик клика, а отображение результата реализуется вручную.
Подобный подход используется в:
При привязке к произвольному элементу часто требуется синхронизация состояния:
const trigger = document.querySelector(".trigger");
const output = document.querySelector(".output");
const fp = flatpickr(trigger, {
clickOpens: true,
onChange: (dates, dateStr) => {
output.dataset.value = dateStr;
output.textContent = `Выбрано: ${dateStr}`;
}
});
Такой паттерн разделяет:
Один календарь может открываться из нескольких мест:
<button class="open-a">A</button>
<button class="open-b">B</button>
<input id="date" type="text">
const fp = flatpickr("#date", {
clickOpens: false
});
document.querySelector(".open-a").addEventListener("click", () => fp.open());
document.querySelector(".open-b").addEventListener("click", () => fp.open());
Такой подход уменьшает количество инстансов календаря и упрощает синхронизацию данных.
При работе с динамически создаваемыми элементами применяется делегирование:
document.addEventListener("click", (e) => {
if (e.target.matches(".date-trigger")) {
fp.open();
}
});
Это особенно полезно в SPA-приложениях, где элементы появляются после инициализации скрипта.
Flatpickr может работать с readonly, но поведение
отличается:
flatpickr("#date", {
allowInput: false
});
<input id="date" type="text" readonly>
Readonly не мешает открытию календаря, но предотвращает ручной ввод. Это типичный вариант для строгих интерфейсов, где значение должно формироваться только через UI.
Inline-режим фактически исключает необходимость триггера:
flatpickr("#calendar", {
inline: true
});
<div id="calendar"></div>
Календарь всегда отображается внутри контейнера, и элемент становится не триггером, а полноценным хостом интерфейса.
В архитектурах с компонентами (React-подобные системы без JSX или vanilla-подход) Flatpickr часто используется как внешний контрол:
class DatePicker {
constructor(root) {
this.root = root;
this.valueEl = root.querySelector(".value");
this.fp = flatpickr(root.querySelector(".trigger"), {
clickOpens: false,
onChange: this.update.bind(this)
});
root.querySelector(".trigger").addEventListener("click", () => {
this.fp.open();
});
}
update(_, dateStr) {
this.valueEl.textContent = dateStr;
}
}
Здесь библиотека отделена от логики отображения, что позволяет интегрировать её в сложные интерфейсы без конфликта ответственности.
При привязке к произвольным элементам важно учитывать фокусировку:
flatpickr(".trigger", {
clickOpens: true,
onOpen: function(_, __, instance) {
instance._input.blur();
}
});
Это предотвращает появление виртуальной клавиатуры на мобильных устройствах при работе с неинпут-элементами.
Полный контроль над открытием достигается отключением стандартного поведения:
flatpickr(".element", {
clickOpens: false
});
В таком режиме библиотека становится чистым API-слоем без привязки к пользовательским кликам.
Привязка Flatpickr к произвольным элементам позволяет полностью разорвать зависимость между календарём и стандартными формами ввода. Это открывает возможность строить интерфейсы, где выбор даты становится частью любого визуального компонента, а не только текстового поля, сохраняя при этом единый механизм управления состоянием и событийную модель библиотеки.