Android 上的 keyCode 总是229

在我的 Samsung Galaxy Tab 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);
});

演示

幸运的是,我可以找到这方面的文章,但我找不到一个有效的解决方案。有人建议使用 keyup代替,或者使用 textInput事件,但是这个事件只在 blur上触发。

现在,最重要的是,这种情况不会发生在默认的股票浏览器上: (

如果你能帮忙,我会很感激的!

更新: 如果事实证明这是不可能的,我仍然可以抓取插入符号之前的字符: 邮寄

58953 次浏览

试试 e.which而不是 e.keyCode

有关此属性的详细信息,请检查 https://api.jquery.com/event.which/

遇到同样的问题,只会发生在安卓系统的三星键盘上。一个解决办法是关闭键盘预测,修复输入。还在进一步分析,看看能否在 JS 的土地上找到一个工作。

编辑: 我已经设法为我们的案子找到了一个解决方案。当时的情况是,我们有一个允许字符的白名单,用户可以在我们的输入框中输入这些字符。这些字母数字字符加上一些白名单控制字符(例如 enter、 esc、 up/down)。任何其他字符输入都将阻止事件默认值。

所发生的情况是,使用密钥编码229的所有事件都被阻止了,因此没有输入任何文本。一旦我们把关键码229也添加到白名单中,一切就恢复正常了。

因此,如果您正在使用某种自定义或第三方表单输入控制组件,请确保检查键码229是否被白名单列出/允许,并且不被默认防止。

希望这对谁有帮助。

我在三星 S7手机上也遇到了同样的问题。通过将事件从按键替换为 按键解决了这个问题。

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

JQuery 规范化了这些内容,因此不需要使用除 e.which https://stackoverflow.com/a/302161/259881之外的任何内容

普通的按键事件不会在 android 设备中提供 keyCode。

如果要捕捉 space barspecial chars的压力,可以使用 textInput事件。

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

注意: textInput不会在字母、数字、退格、回车和其他键上被触发。

我也遇到了同样的问题,找不到任何解决办法。

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


我知道我在回复一个旧的帖子,但是这个问题仍然是开着的,所以我想分享一下我的看法。
然而,这种方法并不是一个确切的解决方案,而只是一个紧急的解决方案,因为我有。
关键是在使用按键时使用文本框的值。对于每一个键的按下值将改变,并在最后的值更新,我们可以使哪一个键已被按下。
注意: 这只适用于键盘上的可见字体,即字母数字和特殊字符,这不会记录任何控制或 shift 或 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
});

解决方案为 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
}
}

AFAIK 这仍然是一个移动问题,因此解决它的唯一方法是提供变通方法。
对于输入键,您可以使用 oninput (event)执行以下操作:

let lastData = null;
function handleInputEvent(inputEvent) {
switch (inputEvent.inputType) {
case "insertParagraph":
// enter code here
break;
case "insertCompositionText":
if (lastData === inputEvent.data) {
// enter code here
}
break;
case "insertText": // empty text insertion (insert a new line)
if (!inputEvent.data) {
// enter code here
}
}
lastData = inputEvent.data;
};

要创建其他变通方案,您可以查看以下文档:
Https://developer.mozilla.org/en-us/docs/web/api/inputevent
和规格: < a href = “ https://w3c.github.io/input-events/# interface-InputEvent”rel = “ nofollow norefrer”> https://w3c.github.io/input-events/#interface-inputevent

一个工作示例,只需键入任何内容,然后按回车键: https://jablazr.github.io/web-console/

也许您希望使用 onbeforeinputoninput事件及其 .data属性来查找字符值,而不是使用 .key.keycodekeydownkeyup

Http://jsfiddle.net/vlga0fb9

Https://caniuse.com/?search=beforeinput

e.target.value.endsWith(',')

你可以使用这个。对于 android设备。

比如

    $(document).on("keyup", '.tagsinput', function (e) {
// console.log('|'+e.target.value.endsWith(',')+'|')
// elif


if (e.keyCode == 188 || e.keyCode == 13 || e.target.value.endsWith(',')) { // KeyCode For comma is 188
// alert('comma added');
word = e.target.value.split(',')[0]
console.log(word.length)
if (word.length != 0) {
console.log(word);
tagsarray.push(word)
e.target.value = ''
tagarea.innerHTML += `<div class="block" id="${word}"><span class="tagscircle">${word}</span><div class="inline-block" attr-val="${word}" onclick="removeTag(event)"><svg attr-val="${word}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="2" d="M20 20L4 4m16 0L4 20"/></svg></div></div>`
resultsBox1.innerHTML = ''
}
else {
e.target.value = ''


}


}
});