Методы и отменяемые события
Ручной экземпляр: show, hide, toggle, dispose и повторный init. Отмена show/hide видна в журнале. Автозакрытие отключено, чтобы внешние управляющие кнопки не скрывали подсказку.
Внешние управляющие элементы:
Журнал событий
<div id="tooltip-api-demo">
<button id="tooltip-api-target" type="button" class="btn btn-surface"
title="Управляемая подсказка">Триггер под управлением API</button>
<p>Внешние управляющие элементы:</p>
<div class="d-flex gap-3" style="flex-wrap: wrap">
<button type="button" class="btn btn-primary btn-sm" id="tooltip-api-show">show()</button>
<button type="button" class="btn btn-surface btn-sm" id="tooltip-api-hide">hide()</button>
<button type="button" class="btn btn-surface btn-sm" id="tooltip-api-toggle">toggle()</button>
<button type="button" class="btn btn-surface btn-sm" id="tooltip-api-dispose">dispose()</button>
<button type="button" class="btn btn-surface btn-sm" id="tooltip-api-init">init()</button>
</div>
<div class="d-flex gap-3 mt-4" style="flex-wrap: wrap">
<label><input type="checkbox" id="tooltip-api-prevent-show"> Отменять show</label>
<label><input type="checkbox" id="tooltip-api-prevent-hide"> Отменять hide</label>
</div>
<pre id="tooltip-api-log" class="tooltip-demo-log" aria-live="polite">Журнал событий</pre>
</div>
/**
* Описание: ручное управление экземпляром VGTooltip.
* Возможности: методы, повторная инициализация и отмена событий show/hide.
*/
import { VGTooltip } from 'vgapp';
function initTooltipDemo() {
const root = document.querySelector('#tooltip-api-demo');
if (!root || root.dataset.ready) return;
root.dataset.ready = 'true';
const target = root.querySelector('#tooltip-api-target');
const log = root.querySelector('#tooltip-api-log');
const write = message => {
log.textContent = (log.textContent + '\n' + message).split('\n').slice(-10).join('\n');
};
const init = () => {
VGTooltip.getOrCreateInstance(target, {
closeOnOutsideClick: false,
closeOther: false,
keyboard: false,
delay: { show: 0, hide: 0 },
animation: { enable: false, delay: 0 }
});
write('init: экземпляр готов');
};
['show', 'shown', 'hide', 'hidden'].forEach(name => {
target.addEventListener('vg.tooltip.' + name, event => {
const prevent = root.querySelector('#tooltip-api-prevent-' + name);
if (prevent?.checked) {
event.preventDefault();
write(name + ': отменено');
} else {
write(name);
}
});
});
['show', 'hide', 'toggle', 'dispose'].forEach(method => {
root.querySelector('#tooltip-api-' + method).addEventListener('click', () => {
const instance = VGTooltip.getInstance(target);
if (!instance) { write('Сначала нажмите init()'); return; }
instance[method]();
if (method === 'dispose') write('dispose: экземпляр удалён, title восстановлен');
});
});
root.querySelector('#tooltip-api-init').addEventListener('click', init);
init();
}
initTooltipDemo();
.tooltip-demo-log {
margin-top: 1rem;
padding: 1rem;
white-space: pre-wrap;
overflow-wrap: anywhere;
background: var(--vg-bg-secondary);
color: var(--vg-text-primary);
border: 1px solid var(--vg-border-default);
border-radius: var(--vg-radius-lg);
}