在 Android 设备中,正常的按键事件不会给出 keyCode。对此已经进行了一次大的讨论。
如果您想捕获
space bar
或special 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()
遇到同样的问题,只发生在 Android 上的三星原装键盘上。解决方法是关闭键盘预测,从而修复输入。仍在进一步分析,看看是否可以在 JS 领域找到解决方法。
编辑:我已经设法为我们的案例找到解决方案。发生的情况是,我们有一个允许用户在输入框中输入的允许字符的白名单。这些是字母数字字符加上一些白名单控制字符(例如 Enter、esc、向上/向下)。任何其他字符输入都会默认阻止事件。
发生的情况是,所有带有键码 229 的事件都被阻止,因此没有输入任何文本。一旦我们将密钥代码 229 添加到白名单中,一切都会恢复正常。
因此,如果您使用某种自定义或第 3 方表单输入控制组件,请务必检查键码 229 是否已列入白名单/允许且未默认阻止。
希望这对某人有帮助。
我在三星 S7 手机上遇到了同样的问题。通过将事件从 keydown 替换为 keypress 解决了这个问题。
$("div, input").keypress(function (e) {
$("#keycode").html(e.which);
});
jQuery 标准化了这些东西,所以除了 e.which 之外不需要使用任何东西 https://stackoverflow.com/a/302161/259881
我知道我正在回答一篇旧帖子,但这个问题仍然存在,所以我想分享对此的看法。
然而,这个方法并不是一个精确的解决方案,而只是像我一样的紧急解决方案。
关键是在使用按键时使用文本框的值。对于每个按键,值都会改变,通过最后一次值更新,我们可以确定按下了哪个键。
注意:这仅适用于键盘上的可见字体,即字母数字和特殊字符,这不会记录任何控制或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
});
据我所知,这在移动设备上仍然是一个问题,因此解决它的唯一方法是提供解决方法。
对于回车键,您可以使用 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
和规格:https://w3c.github.io/input-events/#interface-InputEvent
一个工作示例,只需输入任何内容并按 Enter:https://jablazr.github.io/web-console/
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 = ''
}
}
});
我发现,对于检测
enter
键的特定用例,将输入的 enterkeyhint
设置为 done
修复了“enter”键的此问题。一旦我这样做了,它的关键代码不再是229,而是正确的“输入”代码。
对于 React,我的代码是
<input onInput={handleKeyDown} />
函数是
const handleKeyDown = (e) => {
const keyCode = e.nativeEvent.data.charCodeAt(0);
// Do what you wish with the keyCode
};
针对 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
}
}