安卓上的keyCode始终是229
keyCode on android is always 229
在我的三星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
上触发。
现在,最重要的是,默认的股票浏览器不会发生这种情况:(
任何帮助将不胜感激!
更新:如果事实证明这是不可能的,我仍然可以在插入符号之前抓住字符:发布
正常的按键事件不会在安卓设备中给出按键代码。对此已经进行了大讨论。
如果要捕获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()
遇到同样的问题,只发生在安卓上的三星键盘上。解决方法是关闭键盘预测,从而修复输入。仍在进一步分析,看看是否可以在JS土地中找到解决方法。
编辑:我已经设法为我们的案件找到了解决方案。正在发生的事情是,我们有一个允许用户在我们的输入框中输入的允许字符的白名单。这些是字母数字字符加上一些列入白名单的控制字符(例如回车、esc、上/下)。任何其他字符输入都将阻止事件默认值。
发生的情况是,所有带有键代码 229 的事件都被阻止,因此没有输入任何文本。一旦我们将键码 229 也添加到白名单中,一切恢复正常。
因此,如果您使用的是某种自定义或第三方表单输入控件组件,请确保检查键码 229 是否被列入白名单/允许且未被默认阻止。
希望这对某人有所帮助。
我在三星S7手机上遇到了同样的问题。通过将事件从按键替换为按键来解决它。
$("div, input").keypress(function (e) {
$("#keycode").html(e.which);
});
jQuery规范化了这些东西,所以除了e.this之外不需要使用任何东西 https://stackoverflow.com/a/302161/259881
也许您想使用onbeforeinput
和oninput
事件及其.data
属性来查找字符值,而不是使用.key
和.keycode
keydown
和keyup
。
http://jsfiddle.net/vLga0fb9
https://caniuse.com/?search=beforeinput
我知道我正在回答一篇旧帖子,但这个问题仍然存在,所以我想分享一个观点。
然而,这种方法不是一个精确的解决方案,而只是像我一样的紧急解决方案。
关键是在使用按键时使用文本框的值。对于每个按键,值都会更改,到最后一个值更新时,我们可以确定按下了哪个键。
注意:这仅适用于键盘上的可见字体,即字母数字和特殊字符,这不会记录您所知道的任何控制或 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
});
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规格:https://w3c.github.io/input-events/#interface-InputEvent
一个工作示例,只需输入任何内容并按回车键: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,而是正确的"输入"代码。
针对 WebView 修复它的解决方案,请注意它只处理空格字符,但您可以扩展映射
e.which
。
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
}
}
尝试e.keyCode
而不是CC_22
有关此属性的详细信息,请查看 https://api.jquery.com/event.which/
- JS上的keyCode事件上有多个键
- <text区域>在我的html中包含event.keycode==13之后,wrap就不起作用了
- "#"keyCode=222 vs 51(Chrome与Android版Chrome)-为什么有区别
- event.keycode vs event.which
- JavaScript使event.key警报event.keyCode的基本polyfill实现Chrome的现代化
- 安卓上的keyCode始终是229
- e.keyCode在jquery中不起作用
- 将jQuery onClick切换到keyCode
- event.keyCode not working
- jQuery('#class').keypress Event.keyCode == 13) Not w
- var keycode = window.event.keycode on Firefox
- 如何使用自定义键盘事件和keyCode更改输入/textarea值
- 安卓(三星银河)上的JQuery Mask输入插件,返回的keyCode始终为229
- 如果 e.keyCode 是“输入”按钮,并且元素包含其他文本,则验证条件
- JavaScript window.onsubmit event.keyCode undefined
- 原型方法中的事件处理程序函数,为什么它认为.keyCode是JavaScript中未定义的属性
- e.keyCode和e.which有什么区别
- 如何编写依赖于不按住其他键的 .keycode 事件
- Javascript/jQuery:当capsLock处于打开状态时无法获取正确的keyCode
- Join events按键(带keyCode),然后单击链接