Tippy.js позволяет создавать всплывающие подсказки (tooltips) и элементы всплывающего контента с гибкой настройкой позиционирования и поведения. Одной из мощных возможностей библиотеки является работа с динамически добавляемыми элементами на странице. Рассмотрим эту тему подробно.
Когда элементы создаются после первоначальной загрузки страницы (например, через JavaScript или AJAX), стандартная инициализация Tippy.js на существующих элементах не охватывает новые. Чтобы всплывающие подсказки корректно отображались на таких элементах, применяются следующие подходы:
Делегирование событий (delegate)
Метод tippy.delegate() позволяет назначать всплывающие
подсказки на элементы, которые могут появиться позже. Делегирование
работает через контейнер и CSS-селектор:
tippy.delegate(document.body, {
target: '.dynamic-button',
content: 'Динамический элемент',
placement: 'top',
delay: [100, 100],
});
target — CSS-селектор элементов внутри указанного
контейнера.content — текст или функция, возвращающая содержимое
подсказки.placement — позиция подсказки относительно
элемента.delay — задержка показа и скрытия подсказки.Такой подход позволяет автоматически применять подсказки ко всем
новым элементам, соответствующим селектору
.dynamic-button.
content для динамического содержимогоcontent может быть функцией, что особенно полезно для
динамических данных:
tippy.delegate(document.body, {
target: '.dynamic-item',
content(reference) {
return reference.dataset.tooltip || 'По умолчанию';
},
interactive: true,
});
reference — элемент, для которого создается
подсказка.dataset.tooltip — возможность задавать индивидуальное
содержимое для каждого динамически созданного элемента.Если элементы создаются программно и требуется мгновенная
инициализация, можно использовать обычный вызов tippy()
после добавления элемента в DOM:
const newButton = document.createElement('button');
newButton.textContent = 'Нажми меня';
newButton.classList.add('dynamic-button');
newButton.dataset.tooltip = 'Я подсказка';
document.body.appendChild(newButton);
tippy(newButton, {
content: newButton.dataset.tooltip,
placement: 'right',
});
Этот метод гарантирует, что каждый новый элемент будет иметь собственную подсказку, но при большом количестве элементов проще использовать делегирование.
Если содержимое элемента или его атрибуты изменяются после
инициализации подсказки, можно использовать метод
setContent():
const tip = tippy(newButton, {
content: 'Первоначальный текст',
});
newButton.addEventListener('click', () => {
tip.setContent('Обновленный текст');
});
setContent() позволяет динамически обновлять текст
подсказки без необходимости пересоздавать объект tippy.
Для элементов, которые удаляются из DOM, важно корректно освобождать
ресурсы. Tippy.js предоставляет метод destroy():
const tipInstance = tippy(newButton, { content: 'Подсказка' });
// Позже
tipInstance.destroy();
Если используется делегирование, подсказки автоматически
обрабатываются для всех элементов, и ручное уничтожение отдельных
экземпляров не требуется. Однако при прямой инициализации каждого
элемента destroy() предотвращает утечки памяти.
При работе с динамическими списками, например, генерируемыми из API:
content.tippy.delegate(document.body, {
target: '.list-item',
content(reference) {
return reference.getAttribute('data-title') || 'Нет данных';
},
interactive: false,
});
ref или mounted
хуки, либо делегирование по селектору, если компоненты часто создаются и
удаляются.content как функции позволяет связывать
подсказку с атрибутами или данными элемента, что упрощает управление
содержимым.Эти методы обеспечивают полное управление подсказками для динамически создаваемых элементов, делают интерфейс гибким и масштабируемым, сохраняя высокую производительность при больших объемах данных.