【发布时间】:2021-11-25 19:02:13
【问题描述】:
当用户在 Javascript 的输入框中输入内容时,是否有办法检测日语(或其他语言)输入法编辑器是否处于活动状态?我有一个输入框,它响应回车键来提交表单,但是在使用日语 IME 进行测试时,我意识到用户可能会按下回车键来确认自动完成候选者,这仍然会触发我自己的代码。
基本上,在键入自动完成建议时会出现,我只希望在 IME 完全完成其工作时按回车键来触发表单提交。我确实看到了https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionend_event,看起来我可以使用compositionstart 和compositionend 事件来设置一个布尔值,然后在用户点击回车时检查布尔值;我只是好奇是否有一种方法可以直接查询 IME 是否处于活动状态,因为我有点担心如果事情可能变得不同步,手动处理状态可能会变得脆弱。
编辑:所以我找到了https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing,它可用于检查是否在 IME 的上下文中触发了 keypress 事件,但导致compositionend 事件触发的最后一个 Enter 没有 isComposing设置,所以设置一个布尔值是我发现唯一有效的方法。但是,有一个竞争条件,取决于 keypress 或 compositionend 事件处理程序是否先执行,代码仍可能错误地导致输入,从而导致 IME 退出以触发输入提交。我发现解决这个问题的唯一方法是在 onCompositionEnd 事件处理程序中引入异步延迟,以确保它总是最后。
这样,当在 IME 中按 Enter 时,isIME 布尔值为真,keypress 事件首先完成,检查 isIME 布尔值并在不提交答案的情况下完成,然后 onCompositionEnd 完成并将 isIME 布尔值设置为 false。不确定性不是很好,但这似乎是有效的。
【问题讨论】:
-
我没有使用 IME 的经验,并且在阅读本文之前从不知道它的存在,但是我怀疑在 OS 中激活它时,某些布尔属性设置在 window global 或 window.navigator 或类似的某处
-
我什至不确定该属性是特定于窗口的,还是每个输入框的本地属性。我主要担心的是,多个 IME 是否可能存在于不同的输入字段中,导致我自己的代码混淆了哪些事件对应于哪个输入框。假设所有内容都与每个输入框隔离,那么让每个输入框响应自己的事件并设置自己的布尔值应该可以解决问题。我对 Javascript 还很陌生,所以我不知道这是否是实际工作的方式,或者我希望它们如何工作。我目前的解决方案确实有效,但我不知道它是否会成为未来的证明。
-
这必须取决于操作系统,在我的 macOS 上,当 compositionend 事件触发时没有按键事件。
标签: javascript ime