Как я могу различать клавиши слева и справа, ctrl и alt onkeyup в Chrome с помощью Javascript
ОБНОВЛЕНИЕ: этот вопрос не является дубликатом другого вопроса. Он не имеет ответа в другом месте.
Я был вдохновлен этим вопросом Может ли javascript указать разницу между клавишей сдвига влево и вправо?, чтобы сделать класс ввода клавиатуры для набора игр, чтобы отличить нажатия клавиш для отдельных клавиш.
В то время как теги onkeydown
и onkeyup
в javascript имеют одинаковые коды ключей для left shift или right shift, а также left ctrl/right ctrl и left alt/right alt.
В ответ на вышеупомянутый вопрос современные браузеры теперь возвращают event.location
, указывая, остаются ли эти ключи влево или вправо. IE и Firefox возвращают соответствующее значение местоположения для этих ключей onkeydown
и onkeyup
.
Но Chrome дает только правильное значение onkeydown
. В Chrome shift, ctrl и alt все указывают местоположение onkeyup
of KeyboardEvent.DOM_KEY_LOCATION_STANDARD
, которое неоднозначно.
Вот пример sandbox: jsfiddle.
Если вы нажмете shift, ctrl или alt, onkeydown location
будет корректно отображаться в Chrome (и во всех других браузерах), но в Chrome onkeyup location
будет "стандартным".
соответствующий код:
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;
};
Является ли это ошибкой или каким-то желаемым поведением? В свете этого есть ли другой способ отличить левую и правую стороны от клавиатуры?
UPDATE:
Я работал над этим, слушая, с какой стороны пришел keydown
, вспомнив об этом, и предположив, что последующий keyup
появился с той же стороны. Это не здорово, так как это не всегда верно все время.
Этот вопрос не является дубликатом Как узнать, произошло ли событие из правой клавиши Ctrl?, в котором спрашивали, как отличить left-ctrl от right-ctrl прессы. На этот вопрос действительно ответил вопрос, на который я первоначально ссылался: Может ли javascript указать разницу между левой и правой клавишей сдвига?
Это, по-видимому, является дефектом, специфичным для Chrome, в их поведении API, и поскольку в нем нет полного рабочего процесса, я могу опубликовать отчет об ошибке с проектом Chromium.