From ef8028cfa40f57fd3ca02e66591b4633518f6aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Mon, 20 Jul 2026 11:14:46 +0800 Subject: [PATCH] Add files via upload --- web/static/js/chat.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/web/static/js/chat.js b/web/static/js/chat.js index c4b91406..487ee3d4 100644 --- a/web/static/js/chat.js +++ b/web/static/js/chat.js @@ -56,6 +56,7 @@ const mentionState = { // IME输入法状态跟踪 let isComposing = false; +let compositionEndTimer = null; // 输入框草稿保存相关 const DRAFT_STORAGE_KEY = 'cyberstrike-chat-draft'; @@ -1576,8 +1577,9 @@ function handleChatInputClick(event) { function handleChatInputKeydown(event) { // 如果正在使用输入法输入(IME),回车键应该用于确认候选词,而不是发送消息 - // 使用 event.isComposing 或 isComposing 标志来判断 - if (event.isComposing || isComposing) { + // Safari 可能在确认候选词时先触发 compositionend,再触发 Enter keydown, + // 因此这里同时使用全局状态和 keyCode 229 兜底。 + if (event.isComposing || isComposing || event.keyCode === 229) { return; } @@ -2923,10 +2925,20 @@ if (chatInput) { chatInput.addEventListener('focus', handleChatInputClick); // IME输入法事件监听,用于跟踪输入法状态 chatInput.addEventListener('compositionstart', () => { + if (compositionEndTimer) { + clearTimeout(compositionEndTimer); + compositionEndTimer = null; + } isComposing = true; }); chatInput.addEventListener('compositionend', () => { - isComposing = false; + if (compositionEndTimer) { + clearTimeout(compositionEndTimer); + } + compositionEndTimer = setTimeout(() => { + isComposing = false; + compositionEndTimer = null; + }, 0); }); chatInput.addEventListener('blur', () => { setTimeout(() => {