我有一种奇怪的情况,当按下数字键时,专业PC键盘会在JavaScript中产生奇怪的代码。
使用此网站(http://unixpapa.com/js/testkey.html),我发现按下数字键4时键盘产生了这个:
keydown keyCode=18 which=18 charCode=0
keydown keyCode=101 (e) which=101 (e) charCode=0
keyup keyCode=101 (e) which=101 (e) charCode=0
keydown keyCode=98 (b) which=98 (b) charCode=0
keyup keyCode=98 (b) which=98 (b) charCode=0
keyup keyCode=18 which=18 charCode=0
keypress keyCode=52 (4) which=52 (4) charCode=52 (4)
常规键盘产生这个:
keydown keyCode=52 (4) which=52 (4) charCode=0
keypress keyCode=52 (4) which=52 (4) charCode=52 (4)
keyup keyCode=52 (4) which=52 (4) charCode=0
基本上,这个奇怪的设备持有ALT键,添加两个其他字符,放开ALT键,然后只触发实际键的按键事件,同时完全忽略keydown和keyup。
我可以过滤掉event.altKey
没有问题的第一部分,但是其余部分会导致问题。
问题在于我的代码是为了在keydown上做一件事而另一件是在keyup上做的,而且仅为这一个键盘添加keypress会弄乱一切......
我怀疑是否有解决方案,我们可能只是不支持这个...奇怪的硬件,但以防万一:
有关如何检测键盘是否仅创建按键的任何想法(在此之前过滤掉其他event.altKey
事件之后)?
我尝试了一个包含当前事件代码的全局变量,并在keypress和keyup上重置,否则会收到当前的密码,但我无法让它工作......
这是我的代码:
<input type="text" name="entry" id="entry" onkeyup="Entry('up', this, event);" onkeydown="Entry('down', this, event);" />
是的,所有键盘事件都应该传递到文本字段中,因此这里不需要return
。
还有JavaScript:
function Entry(dir, field, evt)
{
// filter out Num Lock, Alt and Alt Pressed
if (evt.keyCode == 144 || evt.keyCode == 18 || evt.altKey)
return false;
if (dir == 'up') // keyup
{
if (field.value.length > 0)
{
if (evt.keyCode == 13) // Enter pressed
{
EnterUser(); // if more entries are found with FindUser(), select the first one, otherwise empty the screen
}
else
{
FindUser(); // start ajax that checks field content vs database
}
}
}
else // keydown
{
if (!field.disabled)
{
EmptyScreen(); // if the text field is disabled because a dialog box is in front, empty the screen.
}
}
}
当然,诀窍在于支持这种奇怪的键盘,同时不会破坏目前正在使用的其他键盘和条形码扫描仪。
很可能我们必须告诉客户“对不起,给自己一个合适的键盘”或其他东西,但它让我烦恼: - )
对此有何想法?
谢谢!
PS:我在该网站上有jQuery,所以如果有任何好的想法使用它,我也会玩游戏。
答案 0 :(得分:0)
我也偶然发现了这个问题。配置为以alt代码发送文本的条形码扫描仪也可以这样做。
至少对Chrome有一个简单的解决方案(我没有检查过Firefox),但IE和Edge都需要采用不同的方法,因为这些浏览器无法为 Alt引发KeyUp
事件键,这是解决方案的重要组成部分。
Google Chrome会注册 Alt keyUp
事件,事件会翻译“alt-code”。您只需在按住 Alt 键时跳过键,并在 Alt 时检查key
属性KeyUp
事件:
对于IE和Edge浏览器,你需要在保持alt键的同时保存字符,将它们转换为数字并使用String.fromCharCode(057)
得到“9”,问题是很难检测何时转换,因为“alt-code”之后 Alt 按钮没有KeyUp
事件。
我选择并且适用于每个浏览器的解决方案(我认为)是将隐藏的输入字段集中在 Alt 键的KeyDown
事件上,并在更改后读取其内容,因为输入正确处理“替代码”
这可能是迟到的答案,但可能对其他人有用。