Tooltipster предоставляет развитую систему событий, позволяющую управлять жизненным циклом тултипа и организовывать передачу данных между различными частями приложения. События используются для перехвата ключевых моментов работы тултипа: инициализация, открытие, обновление содержимого, закрытие и уничтожение.
Каждое событие может принимать обработчик (callback), внутри которого доступен контекст текущего экземпляра и передаваемые данные.
Tooltipster поддерживает несколько категорий событий:
1. События жизненного цикла:
init — вызывается при инициализации тултипаbefore — перед открытиемready — после открытияafter — после закрытияdestroy — перед уничтожением2. События обновления:
update — при изменении содержимого3. Пользовательские события:
События задаются при инициализации:
$('.tooltip').tooltipster({
functionBefore: function(instance, helper) {
console.log('Перед открытием');
},
functionReady: function(instance, helper) {
console.log('Тултип открыт');
}
});
Каждый обработчик получает параметры:
instance — объект Tooltipsterhelper — вспомогательная информация (DOM-элемент,
событие и др.)Обработчики событий позволяют передавать и изменять данные через:
Пример передачи данных через замыкание:
let sharedData = { counter: 0 };
$('.tooltip').tooltipster({
functionBefore: function(instance) {
sharedData.counter++;
},
functionReady: function(instance) {
instance.content('Открыто: ' + sharedData.counter);
}
});
instance для хранения данныхОбъект instance может выступать как хранилище
состояния:
$('.tooltip').tooltipster({
functionInit: function(instance) {
instance._myData = {
loaded: false
};
},
functionBefore: function(instance) {
if (!instance._myData.loaded) {
instance._myData.loaded = true;
instance.content('Данные загружены');
}
}
});
Такой подход позволяет передавать данные между событиями одного тултипа.
Событие functionBefore часто используется для
асинхронной загрузки данных:
$('.tooltip').tooltipster({
content: 'Загрузка...',
functionBefore: function(instance, helper) {
if (instance._loaded) {
return;
}
$.ajax({
url: '/data',
success: function(response) {
instance.content(response);
instance._loaded = true;
}
});
}
});
Здесь происходит передача данных от сервера в тултип через событие.
Tooltipster позволяет вызывать события вручную:
let instance = $('.tooltip').tooltipster().tooltipster('instance');
instance._on('customEvent', function(data) {
console.log('Получено:', data);
});
instance._trigger('customEvent', { value: 42 });
Это позволяет организовать обмен данными между компонентами.
События Tooltipster можно комбинировать с обычными DOM-событиями:
$('.tooltip').on('click', function() {
let instance = $(this).tooltipster('instance');
instance.content('Клик обработан');
});
Здесь данные передаются от пользовательского действия к тултипу.
helperПараметр helper содержит полезные данные:
$('.tooltip').tooltipster({
functionBefore: function(instance, helper) {
console.log(helper.origin); // исходный элемент
console.log(helper.event); // событие, вызвавшее тултип
}
});
Это позволяет получать контекст и использовать его при формировании содержимого.
События позволяют контролировать поведение тултипа:
$('.tooltip').tooltipster({
functionBefore: function(instance, helper) {
if (!helper.event) {
return false; // отмена открытия
}
}
});
Возврат false предотвращает выполнение действия, что
также влияет на передачу данных.
События могут работать последовательно:
$('.tooltip').tooltipster({
functionInit: function(instance) {
instance._data = { step: 1 };
},
functionBefore: function(instance) {
instance._data.step++;
},
functionReady: function(instance) {
instance.content('Шаг: ' + instance._data.step);
}
});
Каждое событие изменяет общее состояние.
Передача данных между тултипами:
let shared = { message: 'Общее сообщение' };
$('.tooltip1').tooltipster({
functionReady: function(instance) {
instance.content(shared.message);
}
});
$('.tooltip2').tooltipster({
functionBefore: function(instance) {
shared.message = 'Обновлено';
}
});
Здесь используется общий объект для обмена данными.
События помогают синхронизировать состояние:
$('.tooltip').tooltipster({
functionAfter: function(instance) {
console.log('Тултип закрыт, состояние очищено');
}
});
Можно очищать или передавать финальные данные после закрытия.
Частые проблемы:
1. Потеря контекста
functionBefore: function() {
console.log(this); // не instance
}
Решение — использовать instance.
2. Асинхронность Данные могут не успеть загрузиться до открытия.
3. Глобальные переменные Могут привести к конфликтам при множественных тултипах.
instance как локальное хранилищеКэширование данных:
functionBefore: function(instance) {
if (instance._cache) {
instance.content(instance._cache);
return;
}
let data = 'Новые данные';
instance._cache = data;
instance.content(data);
}
Передача параметров из атрибутов:
functionBefore: function(instance, helper) {
let id = $(helper.origin).data('id');
instance.content('ID: ' + id);
}
Tooltipster легко интегрируется с другими библиотеками:
functionBefore: function(instance) {
let data = externalModule.getData();
instance.content(data);
}
События становятся точкой входа для передачи данных извне.
События позволяют реализовать полноценное управление состоянием:
functionInit: function(instance) {
instance.state = 'idle';
},
functionBefore: function(instance) {
instance.state = 'loading';
},
functionReady: function(instance) {
instance.state = 'ready';
}
Состояние передаётся между этапами работы тултипа.
Современный подход:
functionBefore: function(instance) {
return fetch('/data')
.then(response => response.text())
.then(data => {
instance.content(data);
});
}
Это позволяет гибко управлять передачей данных.
Полезные приёмы:
functionBefore: function(instance, helper) {
console.log(instance);
console.log(helper);
}
События Tooltipster формируют мощный механизм взаимодействия, обеспечивающий передачу данных между различными этапами работы тултипа, внешними источниками и пользовательскими действиями.