如何使用Javascript区分Chrome中的左键和右键,ctrl和alt键

时间:2014-04-10 04:06:28

标签: javascript javascript-events keyboard onkeydown onkeyup

更新:此问题与其他问题不重复。它在其他地方没有答案。

我受到这个问题Can javascript tell the difference between left and right shift key?的启发,为游戏套件制作键盘输入类,以区分各个按键的按键。

javascript中的onkeydownonkeyup事件具有 left shift right shift 的相同密钥代码,以及< kbd> left ctrl / right ctrl left alt / right alt

根据对上述问题的回答,现代浏览器现在返回event.location,指示这些键是左还是右。 IE和Firefox会为这些键onkeydownonkeyup返回适当的位置值。

但Chrome仅提供正确的值onkeydown。在Chrome中, shift ctrl alt 都会提供onkeyup KeyboardEvent.DOM_KEY_LOCATION_STANDARD的位置,这是不明确的。

以下是一个示例沙箱:jsfiddle

如果您点击 shift ctrl alt onkeydown location将在Chrome(以及所有其他浏览器)中正​​确显示),但在Chrome中,onkeyup location将是标准的&#39;。

相关代码:

window.onkeydown = function(event)
{
    var o = 'event = onkeydown, which = ' + event.which + ', location = ';

    switch(event.location)
    {
        case KeyboardEvent.DOM_KEY_LOCATION_STANDARD: o += 'standard'; break;

        case KeyboardEvent.DOM_KEY_LOCATION_NUMPAD: o += 'numpad'; break;

        case KeyboardEvent.DOM_KEY_LOCATION_LEFT: o += 'left'; break;

        case KeyboardEvent.DOM_KEY_LOCATION_RIGHT: o += 'right'; break;
    }

    var outputSpan = document.getElementById('output');

    outputSpan.innerHTML = o;
};

window.onkeyup = function(event)
{
    var o = 'event = onkeyup, which = ' + event.which + ', location = ';

    switch(event.location)
    {
        case KeyboardEvent.DOM_KEY_LOCATION_STANDARD: o += 'standard'; break;

        case KeyboardEvent.DOM_KEY_LOCATION_NUMPAD: o += 'numpad'; break;

        case KeyboardEvent.DOM_KEY_LOCATION_LEFT: o += 'left'; break;

        case KeyboardEvent.DOM_KEY_LOCATION_RIGHT: o += 'right'; break;
    }

    var outputSpan = document.getElementById('output');

    outputSpan.innerHTML = o;
};

这是一个错误,还是某种想要的行为?鉴于此,还有另一种方法来区分左键和右键上的键吗?

更新:

我通过倾听keydown来自哪一方,记住它,并假设随后的keyup来自同一方来解决这个问题。这并不是很好,因为它并不一定都是真的。

这个问题不是How can I tell if an event comes from right Ctrl key?的副本,它询问如何区分 left-ctrl right-ctrl 按键。事实上,我最初提到的问题是Can javascript tell the difference between left and right shift key?

这似乎是他们的API行为中特定于Chrome的缺陷,由于没有完整的解决方法,我可能会向Chromium项目提交错误报告。

0 个答案:

没有答案