Tooltipster — это библиотека для создания кастомных тултипов на основе jQuery. При неправильной инициализации или удалении тултипов может происходить накопление DOM-элементов и обработчиков событий, что ведёт к утечкам памяти. Основные источники проблем:
Множественная инициализация одного элемента Если
один и тот же элемент инициируется несколько раз через
$(element).tooltipster({...}), библиотека создаёт новые
DOM-структуры для тултипа без удаления старых. Старые тултипы остаются в
памяти, что постепенно увеличивает потребление.
Неправильное удаление тултипов При динамическом
удалении элементов с тултипами через remove() или
html('') без предварительного вызова destroy
тултипы остаются в DOM и их события продолжают висеть.
Использование стрелочных функций или анонимных коллбеков
в опциях Коллбеки вроде functionReady или
functionAfter при каждом обновлении создают новые
замыкания. Если тултип не уничтожается, замыкания сохраняют ссылки на
элементы и данные, препятствуя сборке мусора.
1. Использование метода destroy
Перед удалением элемента из DOM всегда нужно вызывать:
$('#myElement').tooltipster('destroy');
Это удаляет все обработчики событий, связанные с тултипом, и очищает DOM-элементы тултипа.
2. Проверка инициализации перед созданием
Чтобы избежать повторной инициализации:
if (!$('#myElement').hasClass('tooltipstered')) {
$('#myElement').tooltipster({ theme: 'tooltipster-light' });
}
Класс tooltipstered автоматически добавляется
Tooltipster к элементу после инициализации.
3. Правильное использование коллбеков
Лучше использовать именованные функции вместо анонимных, чтобы при уничтожении тултипа можно было отслеживать и удалять все ссылки:
function onTooltipReady(instance, helper) {
console.log('Tooltip готов');
}
$('#myElement').tooltipster({
functionReady: onTooltipReady
});
Это предотвращает накопление замыканий в памяти.
4. Очистка контента перед динамическим обновлением
Если тултип обновляется динамически, важно использовать метод
content вместо html:
$('#myElement').tooltipster('content', 'Новый контент');
Использование html() или прямого изменения DOM внутри
тултипа без методов Tooltipster может оставить старые узлы в памяти.
Chrome DevTools — Memory
Анализ обработчиков событий
Профилирование через Timeline
Ошибка 1 — множественная инициализация без destroy
$('#btn').tooltipster({ content: 'Содержимое 1' });
$('#btn').tooltipster({ content: 'Содержимое 2' });
Каждый вызов создаёт новый тултип, старый остаётся в памяти.
Ошибка 2 — удаление элемента без destroy
$('#btn').remove();
Тултип остаётся в DOM и удерживает ссылку на удалённый элемент.
Правильный вариант:
$('#btn').tooltipster('destroy').remove();
Ошибка 3 — анонимные коллбеки при частых обновлениях
$('#btn').tooltipster({
functionReady: function(instance, helper) {
console.log('Tooltip ready');
}
});
Каждое обновление создаёт новое замыкание, старое не удаляется.
destroy перед удалением элементов.tooltipstered перед
инициализацией.Эти практики позволяют использовать Tooltipster без риска накопления объектов в памяти и предотвращают типичные утечки при динамическом обновлении и удалении элементов.