Проверьте, не нажата ли клавиша?

Есть ли способ определить, находится ли в настоящее время ключ в JavaScript?

Я знаю о событии "keydown", но это не то, что мне нужно. Некоторое время ПОСЛЕ нажатия клавиши, я хочу, чтобы определить, все еще нажата.

Р. S. Самая большая проблема заключается в том, что после некоторого периода времени ключ начинает повторяться, отбрасывая ключевые события и ключевые события, такие как дьявол. Надеюсь, что есть простая функция isKeyDown (key), но если нет, то эту проблему нужно будет преодолеть/обойти.

Ответ 1

Есть ли способ определить, находится ли в настоящее время ключ в JavaScript?

Неа. Единственная возможность - следить за каждым keyup и keydown и запоминать.

после некоторого периода времени ключ начинает повторяться, вызывая отключение клавиш и события клавиш, например, дьявола.

Не следует. Вы обязательно получите повторение keypress, и во многих браузерах вы также получите повторяющийся keydown, но если keyup повторится, это ошибка.

К сожалению, это не совсем неслыханная ошибка: в Linux, Chromium и Firefox (когда он запускается под GTK +, который находится в популярных дистрибутивах, таких как Ubuntu) генерирует повторяющиеся последовательности keyup-keypress-keydown для которые невозможно отличить от того, кто быстро забивает ключ.

Ответ 2

В дополнение к прослушивателям keyup и keydown для отслеживания, когда клавиша сбрасывается и выполняется резервное копирование, на самом деле есть некоторые свойства, которые говорят вам, если некоторые ключи опущены.

window.onmousemove = function (e) {
  if (!e) e = window.event;
  if (e.shiftKey) {/*shift is down*/}
  if (e.altKey) {/*alt is down*/}
  if (e.ctrlKey) {/*ctrl is down*/}
  if (e.metaKey) {/*cmd is down*/}
}

Это доступно для всех объектов событий, созданных браузером, таких как теги keydown, keyup и keypress, поэтому вам не нужно использовать mousemove.

Я попытался создать собственные объекты событий с document.createEvent('KeyboardEvent') и document.createEvent('KeyboardEvent') и искать e.shiftKey и т.д., но мне не повезло.

Я использую Chrome 17 на Mac

Ответ 3

Мое решение:

var keys = [];
window.onkeyup = function(e) {keys[e.keyCode]=false;}
window.onkeydown = function(e) {keys[e.keyCode]=true;}

Теперь я могу проверить, нажата ли какая-либо клавиша в любом месте в script, проверив

keys["code of the key"]

Если это правда, клавиша нажата.

Ответ 4

Я не верю, что есть что-то вроде функции isKeyDown, но вы можете написать свой собственный.

В принципе, создайте массив, длина которого - это количество ключей, которые вы хотите контролировать. Затем, используя документы/страницы/элементы управления keyUp и keyDown, обновите массив с этим состоянием ключа.

Затем напишите функцию, которая проверяет, отключен ли определенный ключ и возвращает bool.

var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);

function onKeyDown()
{
    // Detect which key was pressed
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = true;
    // Repeat for each key you care about...
}

function onKeyUp()
{
    // Detect which key was released
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = false;
    // Repeat for each key you care about...
}

function isKeyDown(key)
{
    return keyArray[key];
}

Это должно выполнить то, что вы хотите.

Ответ 5

Другие люди задавали этот вопрос раньше (хотя я не вижу здесь очевидных обманов).

Я думаю, что ответ заключается в том, что событие keydown (и его близнец keyup) - это вся информация, которую вы получаете. Повторение довольно прочно подключено к операционной системе, и прикладная программа не получает большой возможности запросить BIOS для фактического состояния ключа.

Что вы можете делать, и, возможно, придется, если вам нужно, чтобы это работало, - это программный отказ от ключа. По существу, вы можете сами оценить keydown и keyup, но проигнорировать событие keyup, если это происходит слишком быстро после последнего keydown... или по существу, вы должны отложить свой ответ на keyup достаточно долго, чтобы убедитесь, что нет другого события keydown, следующего за чем-то вроде 0,25 секунды keyup.

Это предполагает использование активности таймера и запись миллисекундных раз для предыдущих событий. Я не могу сказать, что это очень привлекательное решение, но...

Ответ 6

/*
Tracks what keys are currently down on the keyboard
*/

function keyboard_module(onUpdate){
    var kb = {};
    var unicode_mapping = {};
    document.onkeydown = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        kb[key] = true;
        if(onUpdate){
            onUpdate(kb);
        }
    }

    document.onkeyup = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        delete kb[key];
        if(onUpdate){
            onUpdate(kb);
        }
    }

    function getKey(unicode){
        if(unicode_mapping[unicode]){
            var key = unicode_mapping[unicode];
        }else{
            var key= unicode_mapping[unicode] = String.fromCharCode(unicode);
        }
        return key;
    }
    return kb;
}

function testing(kb){
    console.log('These are the down keys', kb);
}


var keyboard = keyboard_module(testing);

....
//somewhere else in the code
if(keyboard['K']){/*do something special */}

Ответ 7

Следующий код - это то, что я использую:

var altKeyDownCount = 0;
window.onkeydown = function (e) {
    if (!e) e = window.event;
    if (e.altKey) {
        altKeyDownCount++;
        if (30 < altKeyDownCount) {
            $('.key').removeClass('hidden');
            altKeyDownCount = 0;
        }
        return false;
    }
}

window.onkeyup = function (e) {
    if (!e) e = window.event;
    altKeyDownCount = 0;
    $('.key').addClass('hidden');
}

Когда пользователь удерживает клавишу Alt в течение некоторого времени (около 2 секунд), появляется группа меток (class= 'hidden). Когда клавиша Alt отпущена, метки исчезают. Используются jQuery и Bootstrap.

Ответ 8

Посмотрите на этот ответ и используйте onkeyup и onkeydown. Здесь более конкретная информация об этих событиях.

Ответ 9

$('#mytextbox').keydown(function (e) {
            if (e.keyCode == 13) {
                if (e.altKey) {
                    alert("alt is pressed");
                }
            }
 });

если вы нажмете alt + enter, вы увидите предупреждение.