更新:此问题与其他问题不重复。它在其他地方没有答案。
我受到这个问题Can javascript tell the difference between left and right shift key?的启发,为游戏套件制作键盘输入类,以区分各个按键的按键。
javascript中的onkeydown
和onkeyup
事件具有 left shift 或 right shift 的相同密钥代码,以及< kbd> left ctrl / right ctrl 和 left alt / right alt 。
根据对上述问题的回答,现代浏览器现在返回event.location
,指示这些键是左还是右。 IE和Firefox会为这些键onkeydown
和onkeyup
返回适当的位置值。
但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项目提交错误报告。