在 Javascript 的输入框中检测日文 IME 是否处于活动状态

Detect whether Japanese IME is active in input box in Javascript

当用户在 Javascript 的输入框中输入内容时,有没有办法检测日语(或其他语言)输入法编辑器是否处于活动状态?我有一个输入框响应回车键以提交表单,但在使用日语 IME 进行测试时我意识到用户可能会按回车键确认自动完成候选,这仍然会触发我自己的代码。

本质上,当键入自动完成建议出现时,我只希望在输入法完全完成其工作时按回车键触发表单提交。我确实看到了 https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionend_event,看起来我可以使用 compositionstartcompositionend 事件来设置一个布尔值,然后在用户按下回车键时检查布尔值;我只是好奇是否有一种方法可以直接查询 IME 是否处于活动状态,因为我有点担心如果事情可能变得不同步,手动处理状态可能会变得脆弱。

编辑:所以我找到了 https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing,它可用于检查是否在 IME 的上下文中触发了按键事件,但是导致 compositionend 事件的最后一个 Enter fire 没有 isComposing 集,所以设置布尔值是我发现唯一可行的方法。但是,存在竞争条件,根据 keypresscompositionend 事件处理程序是否先进行,代码可能仍会错误地导致输入,从而导致 IME 退出以触发输入提交。我发现解决这个问题的唯一方法是在 onCompositionEnd 事件处理程序中引入异步延迟,以确保它始终持续到最后。

这样,当在 IME 中按 Enter 时,isIME 布尔值为真,keypress 事件先完成,检查 isIME 布尔值并完成而不提交答案,然后 onCompositionEnd 完成并将 isIME 布尔值设置为 false。不确定性不是很好,但这似乎有效。

I have an input box which responds to the enter key to submit a form

只是不要那样做。将您的 <input> 元素放在 <form> 中,并让您的代码响应表单的 submit 事件而不是特定的键事件。在正常输入中按 enter 键已经 select 自动完成候选或提交表单 - 但不是两者 - 默认情况下。