From a46c170fbbcac37230957815231a0366381e0bb8 Mon Sep 17 00:00:00 2001 From: xudan Date: Wed, 15 Oct 2025 16:53:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E8=BF=90=E5=8A=A8?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E9=A1=B5=E9=9D=A2=E5=8F=B3=E9=94=AE=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E9=80=BB=E8=BE=91=EF=BC=8C=E7=A7=BB=E9=99=A4=E5=86=97?= =?UTF-8?q?=E4=BD=99=E4=BA=8B=E4=BB=B6=E7=9B=91=E5=90=AC=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=BC=BA=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=90=86=E7=9A=84=E5=87=86?= =?UTF-8?q?=E7=A1=AE=E6=80=A7=E5=92=8C=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/movement-supervision.vue | 40 +++++++++++++++++------------- src/services/editor.service.ts | 11 +++++--- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/pages/movement-supervision.vue b/src/pages/movement-supervision.vue index a82b8b3..161eb37 100644 --- a/src/pages/movement-supervision.vue +++ b/src/pages/movement-supervision.vue @@ -424,12 +424,6 @@ onMounted(async () => { contextMenuState.value = state; }); - // 监听EditorService的自定义右键菜单事件 - if (editor.value) { - (editor.value as any).on('customContextMenu', (event: Record) => { - handleEditorContextMenu(event); - }); - } // 添加全局点击事件监听器,用于关闭右键菜单 document.addEventListener('click', handleGlobalClick); @@ -572,18 +566,29 @@ let rightClickGuardTimer: ReturnType | undefined; const handleCanvasPointerDown = (event: PointerEvent) => { if (event.button !== 2) return; - contextMenuManager.setState({ isRightClickActive: true }); + console.log('[排查] 1. handleCanvasPointerDown 触发,直接处理右键逻辑'); + // 阻止事件继续传播,防止 Meta2d 库的默认行为抑制 contextmenu 事件 + event.preventDefault(); + event.stopPropagation(); - if (rightClickGuardTimer) { - clearTimeout(rightClickGuardTimer); - } + // 手动构建事件对象,模拟从 EditorService 接收到的数据 + const penData = { + e: event, + clientRect: { + x: event.clientX, + y: event.clientY, + width: 0, + height: 0, + top: event.clientY, + right: event.clientX, + bottom: event.clientY, + left: event.clientX, + }, + pen: editor.value?.store.hover, // 从 editor store 获取当前悬停的元素 + }; - rightClickGuardTimer = setTimeout(() => { - rightClickGuardTimer = undefined; - if (!contextMenuState.value.visible) { - contextMenuManager.setState({ isRightClickActive: false }); - } - }, 200); + // 直接调用右键菜单处理函数 + handleEditorContextMenu(penData); }; //#endregion @@ -599,7 +604,7 @@ const backToCards = () => { * @param penData EditorService传递的pen数据 */ const handleEditorContextMenu = (penData: Record) => { - console.log('EditorService自定义右键菜单事件:', penData); + console.log('[排查] 3. handleEditorContextMenu 开始处理事件', penData); handleContextMenuFromPenData(penData, contextMenuManager, { storageLocationService: storageLocationService.value, robotService: editor.value, // 传递EditorService作为机器人服务 @@ -611,6 +616,7 @@ const handleEditorContextMenu = (penData: Record) => { */ const handleCloseContextMenu = () => { contextMenuManager.close(); + contextMenuManager.setState({ isRightClickActive: false }); }; /** diff --git a/src/services/editor.service.ts b/src/services/editor.service.ts index ed555c0..5aec9ed 100644 --- a/src/services/editor.service.ts +++ b/src/services/editor.service.ts @@ -1199,10 +1199,13 @@ export class EditorService extends Meta2d { // 添加额外的右键事件监听器,确保阻止默认行为 const canvasElement = this.canvas as unknown as HTMLCanvasElement; if (canvasElement && canvasElement.addEventListener) { - canvasElement.addEventListener('contextmenu', (event) => { - event.preventDefault(); - event.stopPropagation(); - }, true); + canvasElement.addEventListener( + 'contextmenu', + (event) => { + event.preventDefault(); // 仅屏蔽浏览器默认菜单,保留 Meta2D 的事件派发 + }, + true, + ); } // 注册自定义绘制函数和锚点