Библиотека Tooltipster предоставляет развитую систему событий, позволяющую перехватывать и управлять поведением тултипов на разных этапах их жизненного цикла. Это особенно важно при реализации сценариев отмены действий, когда необходимо предотвратить открытие, закрытие или обновление подсказки в зависимости от условий.
События в Tooltipster делятся на несколько категорий:
before,
ready)closing,
after)Ключевым инструментом отмены действий выступает использование
обработчиков, в которых можно вызвать event.stop().
Событие before срабатывает перед тем, как тултип будет
показан. В этот момент можно полностью отменить его отображение.
$('.element').tooltipster({
functionBefore: function(instance, helper) {
if (!shouldOpenTooltip()) {
return false;
}
}
});
Альтернативный способ — использование событийного API:
instance.on('before', function(event) {
if (!shouldOpenTooltip()) {
event.stop();
}
});
Особенности:
event.stop() предотвращает дальнейшее выполнение
событияfalse в functionBefore выполняет
аналогичную задачуСобытие closing позволяет перехватить момент закрытия
тултипа и при необходимости его отменить.
instance.on('closing', function(event) {
if (!canCloseTooltip()) {
event.stop();
}
});
Типичные сценарии:
Tooltipster поддерживает асинхронные операции внутри событий, что важно при работе с сервером или задержками.
instance.on('before', function(event) {
event.stop();
fetch('/check-permission')
.then(response => response.json())
.then(data => {
if (data.allowed) {
instance.open();
}
});
});
Ключевые моменты:
instance.open() или
instance.close() завершает сценарийПосле отмены действия можно реализовать повторную попытку:
let attempts = 0;
instance.on('before', function(event) {
if (attempts < 1) {
event.stop();
attempts++;
}
});
Подобный подход используется для:
Отмена действий часто используется в связке нескольких событий:
instance
.on('before', function(event) {
if (!isValidState()) {
event.stop();
}
})
.on('closing', function(event) {
if (isProcessing()) {
event.stop();
}
});
Такой подход позволяет контролировать поведение тултипа на всех этапах:
Tooltipster позволяет динамически обновлять содержимое. События обновления также можно контролировать.
instance.on('updated', function(event) {
if (!isContentValid()) {
event.stop();
}
});
Хотя событие updated чаще используется для реакции, а не
отмены, в сложных сценариях возможно предотвращение некорректных
состояний.
При использовании делегирования (selector) отмена
действий становится особенно важной:
$('body').tooltipster({
selector: '.dynamic-element',
functionBefore: function(instance, helper) {
if ($(helper.origin).hasClass('disabled')) {
return false;
}
}
});
Преимущества:
Tooltipster часто используется в сложных интерфейсах, где важно учитывать пользовательские действия:
instance.on('before', function(event) {
if (userIsDragging) {
event.stop();
}
});
Примеры условий:
Для анализа поведения рекомендуется логировать события:
instance.on('before', function(event) {
console.log('before triggered');
});
instance.on('closing', function(event) {
console.log('closing triggered');
});
Если событие не срабатывает:
instance корректен1. Отсутствие event.stop()
// Ошибка: действие не отменяется
if (!condition) {
return;
}
2. Неправильное использование this
// Лучше использовать instance
instance.open();
3. Асинхронные операции без остановки события
// Ошибка: тултип откроется до завершения fetch
fetch(...);
Защита от открытия при пустых данных:
instance.on('before', function(event) {
if (!instance.content()) {
event.stop();
}
});
Запрет закрытия при наведении на тултип:
instance.on('closing', function(event) {
if ($(instance.elementTooltip()).is(':hover')) {
event.stop();
}
});
Контроль состояния формы:
instance.on('closing', function(event) {
if ($('.form-inside-tooltip').hasClass('dirty')) {
event.stop();
}
});
Грамотное использование событий Tooltipster позволяет превращать простые тултипы в управляемые интерфейсные компоненты с полной логикой контроля их поведения.