From 4243f0b01a3107cc4a3046d2f68d686b1cb893ee Mon Sep 17 00:00:00 2001 From: xudan Date: Mon, 15 Sep 2025 14:06:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Ctrl/Cmd+F=20?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E9=94=AE=E5=8A=9F=E8=83=BD=E4=BB=A5=E8=81=9A?= =?UTF-8?q?=E7=84=A6=E5=B7=A6=E4=BE=A7=E6=90=9C=E7=B4=A2=E6=A1=86=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BA=8B=E4=BB=B6=E7=9B=91=E5=90=AC=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E6=8F=90=E5=8D=87=E7=94=A8=E6=88=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/movement-supervision.vue | 32 +++++++++++++++++++++++- src/pages/scene-editor.vue | 40 ++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/pages/movement-supervision.vue b/src/pages/movement-supervision.vue index 084cd1d..ee1c233 100644 --- a/src/pages/movement-supervision.vue +++ b/src/pages/movement-supervision.vue @@ -50,6 +50,8 @@ const container = shallowRef(); const editor = shallowRef(); const storageLocationService = shallowRef(); const client = shallowRef(); +// 左侧边栏元素引用(用于 Ctrl/Cmd+F 聚焦搜索框) +const leftSiderEl = shallowRef(); // 依赖注入 provide(EDITOR_KEY, editor); @@ -255,6 +257,8 @@ onMounted(async () => { // 添加全局点击事件监听器,用于关闭右键菜单 document.addEventListener('click', handleGlobalClick); document.addEventListener('keydown', handleGlobalKeydown); + // 监听 Ctrl/Cmd+F 聚焦左侧搜索框 + document.addEventListener('keydown', focusFindKeydownHandler); }); onUnmounted(() => { @@ -273,6 +277,7 @@ onUnmounted(() => { // 移除全局事件监听器 document.removeEventListener('click', handleGlobalClick); document.removeEventListener('keydown', handleGlobalKeydown); + document.removeEventListener('keydown', focusFindKeydownHandler); }); //#endregion @@ -399,6 +404,31 @@ const handleGlobalClick = (event: MouseEvent) => { } }; +// 判断事件目标是否在可编辑区域(输入框/文本域/可编辑元素) +const isTypingElement = (el: EventTarget | null) => { + const node = el as HTMLElement | null; + if (!node) return false; + const tag = node.tagName?.toLowerCase(); + return tag === 'input' || tag === 'textarea' || node.isContentEditable === true; +}; + +// Ctrl/Cmd + F 快捷键聚焦左侧搜索输入框 +const focusFindKeydownHandler = (event: KeyboardEvent) => { + const isFindKey = event.key === 'f' || event.key === 'F'; + if ((event.ctrlKey || event.metaKey) && isFindKey && !isTypingElement(event.target)) { + const raw: any = leftSiderEl.value as any; + const sider: HTMLElement | null = (raw && raw.$el) ? (raw.$el as HTMLElement) : (raw as HTMLElement | null); + if (sider) { + const input = sider.querySelector('.search input, .search .ant-input') as HTMLInputElement | null; + if (input) { + event.preventDefault(); + input.focus(); + try { input.select?.(); } catch {} + } + } + } +}; + /** * 处理全局键盘事件,ESC键关闭右键菜单 * @param event 键盘事件 @@ -425,7 +455,7 @@ const handleGlobalKeydown = (event: KeyboardEvent) => { - + diff --git a/src/pages/scene-editor.vue b/src/pages/scene-editor.vue index ea69a0f..057a960 100644 --- a/src/pages/scene-editor.vue +++ b/src/pages/scene-editor.vue @@ -1,6 +1,6 @@