|
24 | 24 | type="text" |
25 | 25 | class="search-input" |
26 | 26 | :placeholder="error ? error : '输入日语单词,如:食べる、猫、きれい、neko'" |
27 | | - @keyup.enter="conjugate" |
| 27 | + @compositionstart="isComposing = true" |
| 28 | + @compositionend="isComposing = false" |
| 29 | + @keyup.enter="handleDictEnter" |
28 | 30 | @input="onInput" |
29 | 31 | @focus="onFocus" |
30 | 32 | @blur="hideSuggestionsWithDelay" |
|
256 | 258 | class="search-input dojo-input" |
257 | 259 | :class="{ 'input-correct': dojoFeedback?.isCorrect, 'input-error': dojoFeedback && !dojoFeedback.isCorrect }" |
258 | 260 | placeholder="输入假名或罗马音..." |
259 | | - @keyup.enter="dojoFeedback ? nextDojoQuestion() : checkDojoAnswer()" |
| 261 | + @compositionstart="isComposing = true" |
| 262 | + @compositionend="isComposing = false" |
| 263 | + @keyup.enter="handleDojoEnter" |
260 | 264 | :disabled="!!dojoFeedback" |
261 | 265 | autocomplete="off" |
262 | 266 | > |
@@ -397,6 +401,7 @@ import Icon from './components/Icon.vue'; |
397 | 401 |
|
398 | 402 | // 全局模式 |
399 | 403 | const currentMode = ref('dict'); // 'dict' | 'dojo' |
| 404 | +const isComposing = ref(false); // 跟踪输入法状态,防止回车键误触 |
400 | 405 |
|
401 | 406 | // 词典模式状态 |
402 | 407 | const form = ref({ |
@@ -458,6 +463,15 @@ const startDojo = async () => { |
458 | 463 | } |
459 | 464 | }; |
460 | 465 |
|
| 466 | +const handleDojoEnter = (e) => { |
| 467 | + if (isComposing.value || e.key !== 'Enter') return; |
| 468 | + if (dojoFeedback.value) { |
| 469 | + nextDojoQuestion(); |
| 470 | + } else { |
| 471 | + checkDojoAnswer(); |
| 472 | + } |
| 473 | +}; |
| 474 | +
|
461 | 475 | const checkDojoAnswer = () => { |
462 | 476 | if (!dojoAnswer.value.trim() || dojoFeedback.value) return; |
463 | 477 | const q = currentQuestion.value; |
@@ -792,6 +806,15 @@ onUnmounted(() => { |
792 | 806 | if (aiProgressInterval) clearInterval(aiProgressInterval); |
793 | 807 | }); |
794 | 808 |
|
| 809 | +const handleDictEnter = (e) => { |
| 810 | + if (isComposing.value) return; |
| 811 | + // 有些输入法(如 macOS 自带日语输入法)在按下回车选词时会触发 keyup.enter |
| 812 | + // 我们通过检查 key 属性和组合状态来避免误触发 |
| 813 | + if (e.key === 'Enter') { |
| 814 | + conjugate(); |
| 815 | + } |
| 816 | +}; |
| 817 | +
|
795 | 818 | const conjugate = async () => { |
796 | 819 | if (loading.value) return; |
797 | 820 | if (aiAbortController) { |
|
0 commit comments