diff --git a/src/ui/Desktop/Apps/File Manager/FileManagerContextMenu.tsx b/src/ui/Desktop/Apps/File Manager/FileManagerContextMenu.tsx index d1093e20..88865d3f 100644 --- a/src/ui/Desktop/Apps/File Manager/FileManagerContextMenu.tsx +++ b/src/ui/Desktop/Apps/File Manager/FileManagerContextMenu.tsx @@ -108,24 +108,66 @@ export function FileManagerContextMenu({ adjustPosition(); - // 点击外部关闭菜单 - const handleClickOutside = (event: MouseEvent) => { - onClose(); - }; + // 延迟添加事件监听器,避免捕获到触发菜单的那次点击 + let cleanupFn: (() => void) | null = null; - // 键盘支持 - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'Escape') { + const timeoutId = setTimeout(() => { + // 点击外部关闭菜单 + const handleClickOutside = (event: MouseEvent) => { + // 检查点击是否在菜单内部 + const target = event.target as Element; + const menuElement = document.querySelector('[data-context-menu]'); + + if (!menuElement?.contains(target)) { + onClose(); + } + }; + + // 右键点击关闭菜单(Windows行为) + const handleRightClick = (event: MouseEvent) => { + event.preventDefault(); onClose(); - } - }; + }; - document.addEventListener('click', handleClickOutside); - document.addEventListener('keydown', handleKeyDown); + // 键盘支持 + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + event.preventDefault(); + onClose(); + } + }; + + // 窗口失焦关闭菜单 + const handleBlur = () => { + onClose(); + }; + + // 滚动时关闭菜单(Windows行为) + const handleScroll = () => { + onClose(); + }; + + document.addEventListener('mousedown', handleClickOutside, true); + document.addEventListener('contextmenu', handleRightClick); + document.addEventListener('keydown', handleKeyDown); + window.addEventListener('blur', handleBlur); + window.addEventListener('scroll', handleScroll, true); + + // 设置清理函数 + cleanupFn = () => { + document.removeEventListener('mousedown', handleClickOutside, true); + document.removeEventListener('contextmenu', handleRightClick); + document.removeEventListener('keydown', handleKeyDown); + window.removeEventListener('blur', handleBlur); + window.removeEventListener('scroll', handleScroll, true); + }; + }, 50); // 50ms延迟,确保不会捕获到触发菜单的点击 return () => { - document.removeEventListener('click', handleClickOutside); - document.removeEventListener('keydown', handleKeyDown); + clearTimeout(timeoutId); + if (cleanupFn) { + cleanupFn(); + } }; }, [isVisible, x, y, onClose]); @@ -271,17 +313,18 @@ export function FileManagerContextMenu({ } return ( -