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/