From 52aecc967fece46e499c21054dcb5cff00a76e91 Mon Sep 17 00:00:00 2001 From: Meleki Date: Sun, 1 Mar 2026 00:01:40 +0100 Subject: [PATCH] fix: Tooltip bleibt nicht mehr nach Navigation stecken, kein nativer Tooltip bei Child-Hover --- wwwroot/js/router.js | 3 +++ wwwroot/js/tooltip.js | 30 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/wwwroot/js/router.js b/wwwroot/js/router.js index 0765bcd..ff0f090 100644 --- a/wwwroot/js/router.js +++ b/wwwroot/js/router.js @@ -10,6 +10,9 @@ function registerPage(name, { init, destroy }) { async function navigateTo(page, params = {}) { const app = document.getElementById('app'); + // Tooltip verstecken + if (window.hideTooltip) window.hideTooltip(); + // Alte Page zerstören if (currentPage && routes[currentPage] && routes[currentPage].destroy) { routes[currentPage].destroy(); diff --git a/wwwroot/js/tooltip.js b/wwwroot/js/tooltip.js index 8dbf75f..38c2b03 100644 --- a/wwwroot/js/tooltip.js +++ b/wwwroot/js/tooltip.js @@ -90,6 +90,12 @@ const target = findTitleTarget(e.target); if (!target) return; + // Gleicher Target → nichts tun (Child-Wechsel innerhalb des gleichen Elements) + if (target === currentTarget) { + clearTimeout(timeout); + return; + } + // title → data-tooltip verschieben (native tooltip unterdrücken) const title = target.getAttribute('title'); if (title) { @@ -101,8 +107,13 @@ if (!text) return; // Falls bereits ein anderer tooltip offen → sofort wechseln - if (currentTarget && currentTarget !== target) { + if (currentTarget) { hide(); + // title des neuen Targets nochmal verschieben (hide hat es nicht zurückgesetzt) + if (target.getAttribute('title')) { + target.setAttribute('data-tooltip', target.getAttribute('title')); + target.removeAttribute('title'); + } } clearTimeout(timeout); @@ -112,12 +123,23 @@ document.addEventListener('mouseleave', function (e) { const target = findTitleTarget(e.target); if (!target) return; - if (target === currentTarget || timeout) { - hide(); - } + if (target !== currentTarget && !timeout) return; + + // Prüfe ob die Maus zu einem Kind-Element des gleichen Tooltip-Targets geht + var related = e.relatedTarget; + if (related && target.contains(related)) return; + + hide(); }, true); // Auch bei Scroll/Resize verstecken document.addEventListener('scroll', hide, true); window.addEventListener('resize', hide); + + // Bei SPA-Navigation verstecken + window.addEventListener('popstate', hide); + window.addEventListener('hashchange', hide); + + // Global verfügbar für SPA-Router + window.hideTooltip = hide; })();