Skip to content

Commit f4c0f05

Browse files
许君山许君山
authored andcommitted
fix: prevent IME enter key from triggering search and submission
- Add @compositionstart and @compositionend to track IME composition state - Create handleDictEnter and handleDojoEnter to ignore Enter keyups while typing Japanese (e.g. macOS Japanese IME) - Ensure consistent behavior for both Dictionary mode and Dojo mode inputs
1 parent 9c2c770 commit f4c0f05

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

frontend/src/App.vue

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
type="text"
2525
class="search-input"
2626
:placeholder="error ? error : '输入日语单词,如:食べる、猫、きれい、neko'"
27-
@keyup.enter="conjugate"
27+
@compositionstart="isComposing = true"
28+
@compositionend="isComposing = false"
29+
@keyup.enter="handleDictEnter"
2830
@input="onInput"
2931
@focus="onFocus"
3032
@blur="hideSuggestionsWithDelay"
@@ -256,7 +258,9 @@
256258
class="search-input dojo-input"
257259
:class="{ 'input-correct': dojoFeedback?.isCorrect, 'input-error': dojoFeedback && !dojoFeedback.isCorrect }"
258260
placeholder="输入假名或罗马音..."
259-
@keyup.enter="dojoFeedback ? nextDojoQuestion() : checkDojoAnswer()"
261+
@compositionstart="isComposing = true"
262+
@compositionend="isComposing = false"
263+
@keyup.enter="handleDojoEnter"
260264
:disabled="!!dojoFeedback"
261265
autocomplete="off"
262266
>
@@ -397,6 +401,7 @@ import Icon from './components/Icon.vue';
397401
398402
// 全局模式
399403
const currentMode = ref('dict'); // 'dict' | 'dojo'
404+
const isComposing = ref(false); // 跟踪输入法状态,防止回车键误触
400405
401406
// 词典模式状态
402407
const form = ref({
@@ -458,6 +463,15 @@ const startDojo = async () => {
458463
}
459464
};
460465
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+
461475
const checkDojoAnswer = () => {
462476
if (!dojoAnswer.value.trim() || dojoFeedback.value) return;
463477
const q = currentQuestion.value;
@@ -792,6 +806,15 @@ onUnmounted(() => {
792806
if (aiProgressInterval) clearInterval(aiProgressInterval);
793807
});
794808
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+
795818
const conjugate = async () => {
796819
if (loading.value) return;
797820
if (aiAbortController) {

0 commit comments

Comments
 (0)