Библиотека Tooltipster предоставляет гибкий механизм управления всплывающими подсказками, включая возможность их закрытия по различным событиям. Одним из наиболее востребованных сценариев является закрытие всплывающего окна при нажатии клавиши Escape. Этот функционал реализуется с помощью опций и событий библиотеки, а также стандартных обработчиков событий клавиатуры в JavaScript.
Tooltipster использует jQuery и предоставляет метод on
для прослушивания событий. Чтобы закрывать тултип по Escape,
необходимо:
keydown.Пример базовой реализации:
$('.tooltip').tooltipster({
trigger: 'custom', // ручное управление открытием
interactive: true
});
// Глобальный обработчик Escape
$(document).on('keydown', function(e) {
if (e.key === 'Escape') {
$('.tooltip').tooltipster('close');
}
});
Объяснение кода:
trigger: 'custom' — отключает автоматическое открытие
тултипа по hover или focus, чтобы полностью контролировать открытие и
закрытие через код.interactive: true — разрешает взаимодействие с
содержимым тултипа без его автоматического закрытия.tooltipster('close') — метод библиотеки, закрывающий
тултип. Вызывается для всех элементов с классом
.tooltip.Если на странице присутствует несколько тултипов, закрывать нужно не
все сразу, а только тот, который открыт. Tooltipster предоставляет метод
tooltipster('instance'), позволяющий работать с конкретной
инстанцией:
$('.tooltip').tooltipster({
trigger: 'custom',
interactive: true
});
$(document).on('keydown', function(e) {
if (e.key === 'Escape') {
$('.tooltip').each(function() {
var instance = $(this).tooltipster('instance');
if (instance.status().open) {
instance.close();
}
});
}
});
Ключевые моменты:
instance.status().open возвращает true,
если тултип открыт.close() инстанции закрывает только конкретный
тултип.На страницах с динамическим контентом тултипы могут создаваться после загрузки страницы. Для корректного закрытия по Escape важно использовать делегирование или следить за созданными инстанциями:
$(document).on('mouseenter', '.dynamic-tooltip', function() {
$(this).tooltipster({
trigger: 'custom',
interactive: true
}).tooltipster('open');
});
$(document).on('keydown', function(e) {
if (e.key === 'Escape') {
$('.dynamic-tooltip').each(function() {
var instance = $(this).tooltipster('instance');
if (instance && instance.status().open) {
instance.close();
}
});
}
});
instance && instance.status().open защищает от
ошибок, если элемент еще не инициализирован.functionReadyTooltipster позволяет использовать колбэки при открытии тултипа. Можно прикреплять обработчик Escape сразу к конкретной инстанции, чтобы не обходить все элементы на странице:
$('.tooltip').tooltipster({
trigger: 'custom',
interactive: true,
functionReady: function(instance, helper) {
$(document).on('keydown.tooltipsterEscape', function(e) {
if (e.key === 'Escape') {
instance.close();
}
});
},
functionAfter: function(instance, helper) {
$(document).off('keydown.tooltipsterEscape');
}
});
Пояснения:
functionReady вызывается при открытии тултипа, что
позволяет привязать обработчик только к активной подсказке.keydown.tooltipsterEscape облегчает
последующее удаление обработчика.functionAfter гарантирует удаление обработчика после
закрытия, предотвращая утечки памяти и конфликт с другими
тултипами.Если тултипы используются внутри модальных окон, необходимо учитывать фокус:
keydown на
контейнере модального окна:$('#modal').on('keydown', function(e) {
if (e.key === 'Escape') {
$('#modal .tooltip').each(function() {
var instance = $(this).tooltipster('instance');
if (instance.status().open) {
instance.close();
}
});
}
});
trigger: 'custom' для
полной свободы управления.instance.status().open для проверки
состояния.functionReady и
functionAfter для привязки и удаления обработчиков на
уровне конкретной инстанции.keydown на контейнере, чтобы избежать конфликтов.Этот подход обеспечивает точное, надежное и масштабируемое управление закрытием тултипов по клавише Escape на любых страницах с Tooltipster.