在 Javascript 中按下输入之前检测 IME 输入

Posted

技术标签:

【中文标题】在 Javascript 中按下输入之前检测 IME 输入【英文标题】:Detecting IME input before enter pressed in Javascript 【发布时间】:2011-11-11 03:02:06 【问题描述】:

我什至不确定这是否可能,如果这是一个愚蠢的问题,请道歉。

我已经通过 jQuery 设置了一个 keyup 回调,以便在用户在输入框中键入时运行一个函数。它适用于英语。

但是,当输入日文/韩文/中文文本时,在用户确认其文本之前不会调用该函数。

是否可以检测到他们已经开始输入,并访问他们尚未完成的文本?

我在想这可能是操作系统级别的东西,所以 javascript 无法访问它。

编辑:我刚刚意识到这适用于 Chrome 和 Safari,但不适用于 Firefox(还没有机会在 Windows 上尝试)。因此 Chrome 调用 keyup 并且可以获取文本。但是我在Firefox中仍然遇到上述问题。

【问题讨论】:

【参考方案1】:

compositionstartcompositionupdatecompositionend 事件 可能会有所帮助。 它们可以帮助您检测何时使用 IME 输入。

例如,考虑使用 IME 以日语输入か (ka)。 将触发以下事件(按显示的顺序):

k(IME 可见)keydown、compositionstartcompositionupdatecompositionend、输入 a(IME 可见)、compositionstartcompositionupdatecompositionend、输入 enter(IME 关闭)keydown,输入

请注意,仅当 IME 可见时(在按下 enter 之前)才会触发合成事件。还要注意 keypress 事件没有被触发。这仅针对非 IME 输入触发。

要访问用户未完成的文本,您可以使用事件的data 属性。

$('#input').on('compositionupdate', function(e) 
    console.log(e.data);
);

有关更多信息,请参阅 MDN:compositionstart、compositionupdate、compositionend、InputEvent。

【讨论】:

更改为按键对我来说效果很好。谢谢!【参考方案2】:

这是 Firefox 中的known issue,浏览器应该做什么isn't clear。

解决此问题的一种可能方法是demonstrated here,其中轮询文本字段以查找文本更改(而不是依赖事件)。

【讨论】:

以上是关于在 Javascript 中按下输入之前检测 IME 输入的主要内容,如果未能解决你的问题,请参考以下文章

如何检测用户何时在输入字段中按 Enter

检测在 VB6 输入框中按下的取消

在 JS/JQuery 中按 ENTER 键之前,如何仅捕获您在文本区域中输入的行? [复制]

检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键

检测用户何时在Java中按下回车

如何检测在导航控制器的下一个视图控制器中按下后退按钮