6 Commits

Author SHA1 Message Date
Valentin Silyutin
ccd4fc13a9 v5.0.0 2025-11-26 23:44:56 +04:00
Valentin Silyutin
0fb2638b59 Регистрируем сообытия mouseenter/mouseleave на тач-устройствах 2025-11-26 23:43:01 +04:00
Valentin Silyutin
eba67fe74f v4.1.1 2025-10-16 00:06:19 +04:00
Valentin Silyutin
690412dc33 Исправление зависаний (в некоторых случаях) всплывающих подсказок 2025-10-16 00:04:57 +04:00
Valentin Silyutin
db9df24786 v4.1.0 2025-09-22 12:57:04 +04:00
Valentin Silyutin
dde1b4f94e Disable mouseenter/mouseleave for touch devices 2025-09-22 12:55:07 +04:00
3 changed files with 95 additions and 60 deletions

View File

@@ -1,3 +1,15 @@
## v5.0.0
- Регистрируем сообытия mouseenter/mouseleave на тач-устройствах
## v4.1.1
- Исправление зависаний (в некоторых случаях) всплывающих подсказок
## v4.1.0
- Отключаем события mouseenter/mouseleave для toch-устройств
## v4.0.0 ## v4.0.0
- Переработана логика инициализации и обновления тултипа - Переработана логика инициализации и обновления тултипа

View File

@@ -8,6 +8,18 @@ const attributeToOption = (attribute) => {
return attribute.charAt(0).toLowerCase() + attribute.slice(1); return attribute.charAt(0).toLowerCase() + attribute.slice(1);
}; };
let visibilityListenerRegistered = false;
const handleVisibilityChange = () => {
if (document.hidden) {
// Скрываем все активные всплывающие подсказки
for (const $tooltip of document.querySelectorAll('.tooltip')) {
if ($tooltip._reference?._tooltip?.isVisible) {
$tooltip._reference._tooltip.hide({ immediately: true });
}
}
}
};
export const createTooltip = ($el, content, options) => { export const createTooltip = ($el, content, options) => {
options = { options = {
animation: [ animation: [
@@ -150,6 +162,10 @@ export const createTooltip = ($el, content, options) => {
return; return;
} }
clearTimeout(showTimeout);
clearTimeout(hideTimeout);
cancelAnimationFrame(rafId);
$el._tooltip.$tooltip?.remove(); $el._tooltip.$tooltip?.remove();
// Вызываем autoUpdateCleanup только если всплывающая подсказка была видна (иначе вызывать её не имеет смысла) // Вызываем autoUpdateCleanup только если всплывающая подсказка была видна (иначе вызывать её не имеет смысла)
@@ -280,21 +296,16 @@ export const createTooltip = ($el, content, options) => {
showTimeout = setTimeout( showTimeout = setTimeout(
async () => { async () => {
if (!$el._tooltip.isVisible) { // Проверяем $el._tooltip на сущестование
(options.appendTo === 'parent' ? $el.parentElement : options.appendTo).append( if (!$el._tooltip || $el._tooltip.isVisible) {
$el._tooltip.$tooltip, return;
); }
$el._tooltip.isVisible = true;
$el._tooltip.autoUpdateCleanup = autoUpdate(
$el,
$el._tooltip.$tooltip,
$el._tooltip.updatePosition,
);
if ( (options.appendTo === 'parent' ? $el.parentElement : options.appendTo).append($el._tooltip.$tooltip);
options.hideOnClick && $el._tooltip.isVisible = true;
(options.trigger.includes('click') || options.trigger.includes('manual')) $el._tooltip.autoUpdateCleanup = autoUpdate($el, $el._tooltip.$tooltip, $el._tooltip.updatePosition);
) {
if (options.hideOnClick && (options.trigger.includes('click') || options.trigger.includes('manual'))) {
document.body.addEventListener('click', $el._tooltip.hideOnClickListener); document.body.addEventListener('click', $el._tooltip.hideOnClickListener);
listeners.push({ listeners.push({
el: document.body, el: document.body,
@@ -317,7 +328,6 @@ export const createTooltip = ($el, content, options) => {
if (options.onShown) { if (options.onShown) {
options.onShown($el._tooltip); options.onShown($el._tooltip);
} }
}
}, },
immediately ? 0 : options.delay[0], immediately ? 0 : options.delay[0],
); );
@@ -327,7 +337,11 @@ export const createTooltip = ($el, content, options) => {
clearTimeout(showTimeout); clearTimeout(showTimeout);
hideTimeout = setTimeout( hideTimeout = setTimeout(
async () => { async () => {
if ($el._tooltip.isVisible) { // Проверяем $el._tooltip на сущестование
if (!$el._tooltip || !$el._tooltip.isVisible) {
return;
}
if (options.onHide) { if (options.onHide) {
options.onHide($el._tooltip); options.onHide($el._tooltip);
} }
@@ -339,6 +353,11 @@ export const createTooltip = ($el, content, options) => {
}).finished; }).finished;
} catch {} // eslint-disable-line no-empty } catch {} // eslint-disable-line no-empty
// Ещё одна проверка на сущестование $el._tooltip после await
if (!$el._tooltip) {
return;
}
if ($el._tooltip.$tooltip) { if ($el._tooltip.$tooltip) {
$el._tooltip.$tooltip.remove(); $el._tooltip.$tooltip.remove();
} }
@@ -348,7 +367,6 @@ export const createTooltip = ($el, content, options) => {
if (options.onHidden) { if (options.onHidden) {
options.onHidden($el._tooltip); options.onHidden($el._tooltip);
} }
}
}, },
immediately ? 0 : options.delay[1], immediately ? 0 : options.delay[1],
); );
@@ -446,4 +464,9 @@ export const createTooltip = ($el, content, options) => {
}; };
registerListeners(); registerListeners();
if (!visibilityListenerRegistered) {
document.addEventListener('visibilitychange', handleVisibilityChange);
visibilityListenerRegistered = true;
}
}; };

View File

@@ -1,6 +1,6 @@
{ {
"name": "@advdominion/tooltip", "name": "@advdominion/tooltip",
"version": "4.0.0", "version": "5.0.0",
"type": "module", "type": "module",
"packageManager": "yarn@4.9.4", "packageManager": "yarn@4.9.4",
"main": "index.js", "main": "index.js",