From ba99ad212ecf72cd1aa72e404f056bfae79b426c Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 2 Feb 2026 10:42:15 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=88=A0=E9=99=A4=E8=81=8A=E5=A4=A9?= =?UTF-8?q?=E6=A1=86=E5=9B=BE=E7=89=87=E6=A0=87=E7=AD=BE=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=88=A0=E9=99=A4=E7=94=BB=E5=B8=83=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改全局键盘事件处理,增加对 contentEditable 元素的检测 - 在删除图片标签时阻止事件冒泡,防止触发画布的删除操作 --- app/canvas/[id]/page.tsx | 10 ++++++++-- components/canvas/CanvasChatPanel.tsx | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/canvas/[id]/page.tsx b/app/canvas/[id]/page.tsx index 134d68a69..b956a42cb 100644 --- a/app/canvas/[id]/page.tsx +++ b/app/canvas/[id]/page.tsx @@ -393,8 +393,14 @@ export default function CanvasEditorPage({ params }: PageProps) { // 键盘快捷键 useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { - // 如果正在输入则不触发快捷键 - if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) { + // 如果正在输入则不触发快捷键(包括 input、textarea 和 contentEditable 元素) + const target = e.target as HTMLElement; + if ( + target instanceof HTMLInputElement || + target instanceof HTMLTextAreaElement || + target.isContentEditable || + target.closest('[contenteditable="true"]') + ) { return; } diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index c8db059d7..93aced713 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -1012,7 +1012,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF e.preventDefault(); handleSend(); } - // 处理 Backspace 删除图片标签 + // 处理 Backspace 删除图片标签(只删除聊天框中的标签,不影响画布) if (e.key === 'Backspace') { const selection = window.getSelection(); if (selection && selection.rangeCount > 0) { @@ -1022,6 +1022,7 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF const prevSibling = range.startContainer.previousSibling as HTMLElement; if (prevSibling && prevSibling.getAttribute?.('data-attachment-index')) { e.preventDefault(); + e.stopPropagation(); // 🆕 阻止事件冒泡,防止触发全局删除 const index = parseInt(prevSibling.getAttribute('data-attachment-index') || '0'); removeAttachment(index); prevSibling.remove();