Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理仅产生按键而非按键向下/按键向上事件的键盘_Javascript_Jquery_Events_Event Handling - Fatal编程技术网

Javascript 处理仅产生按键而非按键向下/按键向上事件的键盘

Javascript 处理仅产生按键而非按键向下/按键向上事件的键盘,javascript,jquery,events,event-handling,Javascript,Jquery,Events,Event Handling,我有一个奇怪的情况,一个特殊的PC键盘在按下数字键时会产生奇怪的JavaScript代码 使用此网站,我发现键盘在按数字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

我有一个奇怪的情况,一个特殊的PC键盘在按下数字键时会产生奇怪的JavaScript代码

使用此网站,我发现键盘在按数字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上做一件事,在keydup上做另一件事,而只为这一个键盘添加keypress就把一切都搞糟了

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

关于如何检测键盘在过滤掉其他event.altKey事件之后是否只创建keypress,您有什么想法吗

我试着使用一个全局变量,该变量包含当前事件代码,并且在keypress和keyup上重置,否则将接收当前的keycode,但我就是无法让它工作

这是我的密码:

<input type="text" name="entry" id="entry" onkeyup="Entry('up', this, event);" onkeydown="Entry('down', this, event);" />
当然,诀窍是支持这种奇怪的键盘,同时不破坏目前正在工作的其他键盘和条形码扫描仪

很可能,我们必须向客户道歉,给自己买一个合适的键盘或其他东西,但这让我感到困扰:-

有什么想法吗

谢谢


PS:我在那个网站上有jQuery,所以如果有任何好的想法使用它,我也会是游戏玩家。

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

至少Chrome有一个简单的解决方案,我还没有检查firefox,但IE和Edge都需要一种不同的方法,因为这些浏览器无法为Alt键引发KeyUp事件,而Alt键是解决方案的关键部分

Google chrome注册Alt keyUp事件,该事件转换Alt代码。您只需在按住Alt键的同时跳过键,并在Alt KeyUp事件中检查key属性:

对于IE和Edge浏览器,您需要在按住alt键的同时保存字符,将它们转换为数字,然后使用String.fromCharCode057获取9,问题是很难检测何时转换,因为alt代码后alt按钮没有KeyUp事件

我选择的解决方案适用于我认为的每个浏览器,就是将隐藏的输入字段集中在Alt-key的KeyDownevent上,并在更改后读取其内容,因为输入可以正确处理Alt代码


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

胡乱猜测:您可以尝试使用addEventListener来连接您的事件处理程序,以防传递给该回调的事件对象与在HTML中使用onkeyup得到的事件对象有所不同/更好。您已经解释了该键盘的功能,但你知道为什么会这样吗?它是为残疾人设计的可编程键盘吗?如果是这样,它可能有一个正常模式。据我所知,它是某种形式的出纳或POS键盘。我希望它可以被重新编程,不这样做:-今天回家,明天继续回复,谢谢!此行为可能会因运行的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.
        }
    }
}