Javascript 检测不同系统和键盘上键入的密钥的最佳方法?Chrome手机密码错误

Javascript 检测不同系统和键盘上键入的密钥的最佳方法?Chrome手机密码错误,javascript,android,reactjs,google-chrome,chromium,Javascript,Android,Reactjs,Google Chrome,Chromium,我正在处理这个特殊输入,我需要允许/禁止用户键入一些键 我正在对onKeyDown处理程序进行验证 这就是我一开始所做的: const ALLOWED_KEYS = [ "Ctrl", "Meta", "Shift","Home", "End", "Backspace", "Delete", "ArrowLeft", "ArrowRight", "Tab", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ".", ","

我正在处理这个特殊输入,我需要允许/禁止用户键入一些键

我正在对
onKeyDown
处理程序进行验证

这就是我一开始所做的:

const ALLOWED_KEYS = [
  "Ctrl", "Meta", "Shift","Home", "End", 
  "Backspace", "Delete", "ArrowLeft", "ArrowRight", "Tab", 
  "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
  ".", ","
];

function onKeyDown(event) {
  if (ALLOWED_KEYS.indexOf(event.key) === -1) {
    event.preventDefault();
  }
}
但是我担心键的字符串名称在不同浏览器中不一致,所以这里有人告诉我应该改为
event.keyCode
,而不是
event.key

在这个链接上,我可以检查每个关键代码:

无论如何,这两个选项都可以在Chrome桌面上使用,但在Chrome Mobile上失败了

当我在Android移动设备上测试
keyCodes
时,我得到了完全不同的数字:

例如:

KEY CODES FOR THE CHAR "0"

DESKTOP NORMAL KEYBOARD : 48
DESKTOP NUMERIC KEYPAD : 96
ANDROID MOBILE KEYBOARD : 229  (EVERY DIGIT SHOW AS 229)

-----------------

KEY CODES FOR THE CHAR "," (COMMA)

DESKTOP NORMAL KEYBOARD : 188
DESKTOP NUMERIC KEYPAD : 110
ANDROID MOBILE KEYBOARD : 229   (EVERY DIGIT, COMMA AND POINT SHOW AS 229)
注:在安卓手机上,所有数字、逗号和点似乎都返回
keyCode
229
On

更新1:

刚刚用
event.charCode
进行了测试,但每个键都记录为
charCode:0

更新2:

关于此链接: 我的Android Chrome手机上的每一个按键都显示为
未识别
。这很奇怪

更新3:

这是Chrome Mobile的一个问题。Firefox Mobile可以完美地处理它。没有在其他浏览器上测试过

2012年,Chromium杂志报道了这一缺陷:

问题


检测键盘、浏览器或系统上输入的按键的通用方法是什么?

根据我所做的所有研究,以下是答案:

如果您计划在Android上支持Chrome Mobile,请不要使用
onKeyDown
(可能还有其他
KeyboardEvents
,例如
onKeyPres
onKeyUp
),因为将无法读取正在键入的键。

这是一个错误。同样的情况也发生在我的三星互联网上,因为它也是基于铬的

自2012年以来,关于铬的话题就有了一个新的话题。我在2020年写这篇文章

在过去的8年里,那里正在进行激烈的讨论

这个问题在安卓Firefox中不会发生,但在Chromium中这并不是一件小事。不知道为什么


我一直在寻找解决方案,因为当您在
onKeyDown
处理程序中调用
event.preventDefault
时,您不会得到插入符号跳转(至少在Mobile Chrome上不会)。如果要在
onChange
处理程序中修复输入值,则需要处理插入符号跳转


我最后处理的是插入符号跳跃。

@stacks没有任何效果。这方面有一项工作。我必须跟踪
caretPosition
并在该位置对
char
作出反应,以获得
charCode
。请注意,
charCode
可能与
keyCode
不同。干得好!是的,我知道。这很奇怪,但至少我们一起了解了关键事件!以前我把你的帖子投了更高的票,所以有人可以回答你,但不幸的是没有人在正确的时间来。你找到解决这个问题的办法了吗?我也面临着这个问题,无法检测自定义android键盘上的退格。不过,本机安卓键盘可以工作。
KEY CODES FOR THE CHAR "0"

DESKTOP NORMAL KEYBOARD : 48
DESKTOP NUMERIC KEYPAD : 96
ANDROID MOBILE KEYBOARD : 229  (EVERY DIGIT SHOW AS 229)

-----------------

KEY CODES FOR THE CHAR "," (COMMA)

DESKTOP NORMAL KEYBOARD : 188
DESKTOP NUMERIC KEYPAD : 110
ANDROID MOBILE KEYBOARD : 229   (EVERY DIGIT, COMMA AND POINT SHOW AS 229)