当用户在Javascript中输入框时,是否有一种检测日语(或其他语言)输入法编辑器处于活动状态的方法?我有一个输入框,它响应enter键来提交表单,但是在用日语IME进行测试时,我意识到用户可能会按enter来确认一个自动完成的候选人,这仍然会触发我自己的代码。
本质上,当输入自动完成建议时,我只希望enter键在IME完全完成其工作时触发表单提交。我确实看到了https://developer.mozilla.org/en-US/docs/Web/API/Element/compositionend_event,它看起来像我可以使用compositionstart
和compositionend
事件来设置一个布尔值,然后在用户点击enter时检查布尔值;我只是好奇是否有一种方法可以直接询问IME是否是活动的,因为我有点担心手动处理状态可能会变得很脆弱,如果事情变得不同步的话。
编辑:所以我找到了https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/isComposing,它可以用来检查按键事件是否是在IME上下文中触发的,但是导致compositionend
事件触发的最后一个Enter没有设置isComposing,所以设置一个布尔值是我发现的唯一有效的东西。但是,存在一个争用条件,取决于keypress
或compositionend
事件处理程序是先执行,代码可能仍然会错误地导致enter,这会导致IME退出以触发输入提交。我发现的唯一解决办法是在onCompositionEnd
事件处理程序中引入异步延迟,以确保始终保持在最后。
这样,在IME中单击Enter时,isIME
布尔值为true,keypress
事件首先结束,检查isIME
布尔值并在未提交答案的情况下完成,然后onCompositionEnd
完成并将isIME
布尔值设置为false。非决定论并不是很好,但这似乎奏效了。
发布于 2022-02-04 02:17:02
我有一个输入框,它响应enter键来提交表单
别这样就行了。将<input>
元素放入<form>
中,让代码响应表单的submit
事件,而不是特定的键事件。默认情况下,在正常输入中按enter键将选择一个自动完成的候选项或提交表单(但不是两者都提交)。
https://stackoverflow.com/questions/70116138
复制相似问题