keyCode на android всегда 229

На моей вкладке Samsung Galaxy 4 (Android 4.4.2, Chrome: 49.0.2623.105) Я столкнулся с ситуацией, когда keyCode всегда 229.

Я установил простой тест для двух ситуаций

<div contenteditable="true"></div>
<input>
<span id="keycode"></span>

сценарий:

$('div, input').on('keydown', function (e) {
    $('#keycode').html(e.keyCode);
});

DEMO

К счастью, я могу найти сообщения об этом, но я не смог найти его с рабочим решением. Кто-то предложил вместо этого использовать keyup или использовать событие textInput, но тот только уволен с blur.

Теперь, чтобы все это произошло, этого не происходит с браузером акций по умолчанию :(

Любая помощь будет оценена!

UPDATE: Если окажется, что это невозможно, я все равно могу захватить символ перед каретой: post

Ответ 1

Обычное событие нажатия клавиши не дает keyCode в устройстве Android. Об этом уже шла большая дискуссия.

Если вы хотите захватить печать space bar или special chars, вы можете использовать событие textInput.

$('input').on('textInput', e => {
     var keyCode = e.originalEvent.data.charCodeAt(0);
     // keyCode is ASCII of character entered.
})

Примечание: textInput не запускается по алфавиту, номеру, обратному пространству, enter и нескольким другим клавишам.

Ответ 2

У меня была такая же проблема, и я не мог найти никаких решений. Я решил это с помощью JavaScript.

event.target.value.charAt(event.target.selectionStart - 1).charCodeAt()

Ответ 3

Запуск в ту же проблему, только с клавиатурой Samsung на Android. Работа вокруг заключалась в том, чтобы отключить предсказания клавиатуры, которые фиксировали вход. Все еще анализируя далее, чтобы увидеть, можно ли найти работу на земле JS.

Изменить: мне удалось найти решение для нашего дела. Случилось то, что у нас был белый список разрешенных символов, которым разрешалось вводить пользователя в поле ввода. Это были буквенно-цифровые символы и некоторые управляемые символы белого цвета (например, введите, esc, вверх/вниз). У любого другого символьного ввода было бы предотвращено событие по умолчанию.

Случилось так, что все события с кодом 229 были предотвращены, и в результате текст не был введен. Как только мы добавили в белый список код 229, все вернулось к функционированию нормально.

Поэтому, если вы используете какой-то пользовательский или сторонний компонент управления входными формами, убедитесь, что код 229 имеет белый цвет/разрешен и не установлен по умолчанию.

Надеюсь, это поможет кому-то.

Ответ 4

У меня была такая же проблема на телефонах Samsung S7. Решил его, заменив событие от нажатия клавиш до нажатия клавиши.

$("div, input").keypress(function (e) {
    $("#keycode").html(e.which); 
});

jQuery нормализует этот материал, поэтому нет необходимости использовать что-либо другое, кроме e.which fooobar.com/questions/12572/...

Ответ 5


Я знаю, что я отвечаю на старый пост, но эта проблема все еще включена, поэтому я хотел бы поделиться ею.
Однако этот метод не является точным решением, а просто решением для срочности, как и у меня.
Ключ должен использовать значение текстового поля при использовании нажатия клавиши. для каждого нажатия клавиши значение изменится, и при последнем обновлении значения мы можем сделать, какая клавиша была нажата.
Примечание: это работает только для видимого шрифта на клавиатуре, то есть буквенно-цифровых и специальных символов, это не будет записывать какие-либо клавиши управления или сдвига или клавиши alt, как вы знаете

  $('input').keyup(function () {
  var keyChar = $(this).val().substr(-1);

 //you can do anything if you are looking to do something with the visible font characters
  });

Ответ 6

Решение исправить это для WebView, обратите внимание, что он обрабатывает только пробел , но вы можете расширить отображение KeyEvent.KEYCODE_SPACE => keyCode.

class MyWebview: WebView {
    override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection? {
        return BaseInputConnection(this, true)
    }

    override fun dispatchKeyEvent(event: KeyEvent?): Boolean {
        val dispatchFirst = super.dispatchKeyEvent(event)

        // Android sends keycode 229 when space button is pressed(and other characters, except new line for example)
        // So we send SPACE CHARACTER(here we handles only this case) with keyCode = 32 to browser explicitly

        if (event?.keyCode == KeyEvent.KEYCODE_SPACE) {
            if (event.action == KeyEvent.ACTION_DOWN) {
                evaluateJavascript("javascript:keyDown(32)", null)
            } else if (event.action == KeyEvent.ACTION_UP) {
                evaluateJavascript("javascript:keyUp(32)", null)
            }
        }

        return dispatchFirst
    }
}

Ответ 7

Попробуйте e.which вместо e.keyCode

Для получения дополнительной информации об этом свойстве проверьте https://api.jquery.com/event.which/