处理仅产生按键而不是keydown / keyup事件的键盘

时间:2013-09-03 21:46:33

标签: javascript jquery events event-handling

我有一种奇怪的情况,当按下数字键时,专业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,所以如果有任何好的想法使用它,我也会玩游戏。

1 个答案:

答案 0 :(得分:0)

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

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

Google Chrome会注册 Alt keyUp事件,事件会翻译“alt-code”。您只需在按住 Alt 键时跳过键,并在 Alt 时检查key属性KeyUp事件:

enter image description here

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

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

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