火狐中日语IME按下Enter触发keypress事件,Edge无此情况,如何解决?
问题分析与解决方案
这是浏览器行为差异,而非FireFox Bug
不同浏览器对IME(输入法编辑器)交互的事件处理逻辑存在差异:
- FireFox在通过Enter键结束日语IME输入模式时,会触发
keypress事件并将event.key设为"Enter" - Chromium内核的Edge/Chrome会区分IME确认操作与普通Enter按键,不会在IME确认时触发该
keypress的Enter判断
这种差异属于浏览器厂商对IME事件规范的实现细节不同,并非FireFox的Bug。
规避方案:通过isComposing属性区分IME操作与普通按键
可以利用KeyboardEvent.isComposing属性判断当前是否处于IME输入组合状态,同时建议改用更可靠的keydown事件(keypress已被MDN标记为废弃),修改后的代码如下:
const input = document.getElementById("myInput"); input.addEventListener("keydown", function(event) { // 仅当按下Enter且不处于IME输入组合状态时触发按钮点击 if (event.key === "Enter" && !event.isComposing) { event.preventDefault(); document.getElementById("myBtn").click(); } });
原理说明
isComposing属性在IME输入过程中(比如日语假名输入阶段)为true,当按下Enter确认IME输入时,FireFox会先触发keydown事件且isComposing仍为true,确认完成后才会变为false- 加上
!event.isComposing条件后,就能过滤掉IME确认时的Enter触发,只响应普通的Enter按键操作
内容的提问来源于stack exchange,提问作者Damn Vegetables
相关产品推荐
相关产品推荐

