diff --git a/packages/ui/src/components/common.tsx b/packages/ui/src/components/common.tsx index 476128c..da4d97f 100644 --- a/packages/ui/src/components/common.tsx +++ b/packages/ui/src/components/common.tsx @@ -73,13 +73,19 @@ export function ContextMenu({ useEffect(() => { if (!menu) return; - const close = () => onClose(); + // pointerdown(capture) 关闭:打开菜单的那次交互已完成 pointerdown, + // 不会被自己关掉(click 监听在 WKWebView 等环境存在"即开即关"竞态) + const close = (e: Event) => { + const panel = ref.current; + if (panel && e.target instanceof Node && panel.contains(e.target)) return; + onClose(); + }; const onKey = (e: KeyboardEvent) => e.key === "Escape" && onClose(); - window.addEventListener("click", close); + window.addEventListener("pointerdown", close, true); window.addEventListener("resize", close); window.addEventListener("keydown", onKey); return () => { - window.removeEventListener("click", close); + window.removeEventListener("pointerdown", close, true); window.removeEventListener("resize", close); window.removeEventListener("keydown", onKey); };