1

我有一个奇怪的情况,一个特殊的 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 键,然后只触发实际键的 keypress 事件,同时完全忽略 keydown 和 keyup。

event.altKey我可以毫无问题地过滤掉第一部分,但导致问题的是其余部分。

问题是我的代码被编写为在 keydown 上做一件事,在 keyup 上做另一件事,并且仅为这个键盘添加 keypress 会搞砸一切......

我怀疑是否有解决方案,我们可能只是不支持这个......奇怪的硬件,但以防万一:

关于如何检测键盘是否仅创建按键(在此之前过滤掉其他event.altKey事件之后)的任何想法?

我尝试拥有一个包含当前事件代码的全局变量,并且在 keypress 和 keyup 上都被重置,否则接收当前的 keycode,但我无法让它工作......

这是我的代码:

<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,所以如果有任何使用它的好主意,我也会玩。

4

1 回答 1

0

我也偶然发现了这个问题。配置为以 alt 代码发送文本的条形码扫描仪也可以执行此操作。

至少对于 Chrome 有一个简单的解决方案(我没有检查过 firefox),但 IE 和 Edge 都需要不同的方法,因为这些浏览器无法引发AltKeyUp键的事件,这是解决方案的重要组成部分。

谷歌浏览器注册了Alt keyUp事件,并且事件翻译了“alt-code”。您需要做的就是在按住 Alt键时跳过键,并在发生Alt事件时检查key属性: KeyUp

在此处输入图像描述

对于 IE 和 Edge 浏览器,你需要按住 alt 键保存字符,将它们转换为数字并使用String.fromCharCode(057)得到“9”,问题是很难检测何时转换,因为AltKeyUp没有事件“替代代码”后的按钮。

我选择并且适用于每个浏览器(我认为)的解决方案是将隐藏的输入字段集中在AltKeyDown键的事件上,并在更改后读取其内容,因为输入正确处理“Alt 代码”

这可能是迟到的答案,但可能对其他人有用。

于 2018-05-11T11:16:54.643 回答