Обнаружение ввода IME перед нажатием Enter в Javascript - PullRequest
7 голосов
/ 06 сентября 2011

Я даже не уверен, возможно ли это, поэтому извиняюсь, если это глупый вопрос.

Я установил обратный вызов keyup через jQuery для запуска функции, когда пользователь вводит в поле ввода. Отлично работает на английском.

Однако при вводе текста на японском / корейском / китайском языке эта функция не вызывается, пока пользователь не подтвердит их текст.

Можно ли обнаружить, что они начали печатать, и получить доступ к их пока неоконченному тексту?

Я думаю, что это может быть на уровне ОС, поэтому у Javascript нет доступа к нему.

Редактировать: Я только что понял, что это работает в Chrome и Safari, но не в Firefox (еще не было возможности попробовать это в Windows). Таким образом, Chrome вызывает keyup, и можно получить текст. Но у меня все еще есть вышеупомянутая проблема в Firefox.

Ответы [ 2 ]

13 голосов
/ 08 мая 2016

События compositionstart, compositionupdate и compositionend могут быть полезны.Они помогают определить, когда используется вход IME.

Например, рассмотрите возможность использования IME для ввода か (ka) на японском языке.
Будут вызваны следующие события (в указанном порядке):

  • k (виден IME), составное начало , составное обновление , составное окончание , ввод
  • a (IME видимый), составное начало , составное обновление , составное окончание , ввод
  • ввод (IME закрыт), ввод

Обратите внимание, что события составления запускаются только тогда, когда IME виден (до нажатия , введите ).Также обратите внимание, что событие нажатие клавиши не вызывается.Это срабатывает только для ввода без IME.

Чтобы получить доступ к незаконченному тексту пользователя, вы можете использовать свойство события data.

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

Для получения дополнительной информации см. MDN: составное начало , составное обновление , составное окончание , InputEvent .

5 голосов
/ 07 сентября 2011

Это известная проблема в Firefox, и что браузеры должны делать неясно .

Возможный метод решения этой проблемы - , показанный здесь , где текстовое поле опрашивается для изменений в тексте (а не полагается на события).

...