From 405cc77d0b8e7e864137ba9f485c47e4f1fb07af Mon Sep 17 00:00:00 2001 From: Hsieh Chin Fan Date: Thu, 24 Oct 2024 01:02:45 +0800 Subject: feat: improve menu element * add observer for display and position, in case no menu item inside * remove all existing menus when oncontextmenu --- src/dumbymap.mjs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) (limited to 'src/dumbymap.mjs') diff --git a/src/dumbymap.mjs b/src/dumbymap.mjs index 8b9a2a6..2f2b67f 100644 --- a/src/dumbymap.mjs +++ b/src/dumbymap.mjs @@ -527,25 +527,27 @@ export const generateMaps = (container, { /** MENU: Menu Items for Context Menu */ container.oncontextmenu = e => { + container.querySelectorAll('.dumby-menu').forEach(m => m.remove()) const map = e.target.closest('.mapclay') const block = e.target.closest('.dumby-block') if (!block && !map) return e.preventDefault() - /** MENU: Prepare Context Menu */ + // Add menu element const menu = document.createElement('div') menu.classList.add('menu', 'dumby-menu') menu.onclick = (e) => { - const keepMenu = e.target.closest('.keep-menu') || e.target.classList.contains('.keep-menu') - if (keepMenu) return - + if (e.target.closest('.keep-menu')) return menu.remove() } - container.body.appendChild(menu) - - menu.replaceChildren() - menu.style.display = 'block' - menu.style.cssText = `left: ${e.clientX - menu.offsetParent.offsetLeft + 10}px; top: ${e.clientY - menu.offsetParent.offsetTop + 5}px;` + container.appendChild(menu) + new MutationObserver(() => { + menu.style.display = 'block' + menu.style.left = (e.clientX - menu.offsetParent.offsetLeft + 10) + 'px' + menu.style.top = (e.clientY - menu.offsetParent.offsetTop + 5) + 'px' + clearTimeout(menu.timer) + }).observe(menu, { childList: true }) + menu.timer = setTimeout(() => menu.remove(), 100) // Menu Items for map if (map?.renderer?.results) { -- cgit v1.2.3-70-g09d2