Подтвердить что ты не робот

Может ли jQuery.keypress() обнаруживать одновременно несколько ключей?

Есть ли способ для jQuery обнаружить, что одновременно было нажато несколько клавиш?

Есть ли какая-либо альтернатива, которая позволяет одновременно нажимать две клавиши?

4b9b3361

Ответ 1

Чтобы обнаружить несколько удерживаемых нажатий клавиш, используйте события keydown и keyup.

var keys = {};

$(document).keydown(function (e) {
    keys[e.which] = true;
});

$(document).keyup(function (e) {
    delete keys[e.which];
});

Я собрал здесь демо: http://jsfiddle.net/gFcuU/. Это весело, хотя я заметил, что моя клавиатура может обнаружить не более 6 клавиш.

Ответ 2

Это зависит. Для "нормальных" клавиш это означает, что не- Shift, Ctrl, ALT, (CMD) ответ отрицательный, обработчик события будет захватывать/запускать в очереди один за другим.

Для ключей модификатора, о которых я упоминал выше, в объекте события есть свойство.

Пример:

$(document).bind('keypress', function(event) {
    if( event.which === 65 && event.shiftKey ) {
        alert('you pressed SHIFT+A');
    }
});

Jsfiddle demo.

Другие свойства:

  • event.ctrlKey
  • event.altKey
  • event.metaKey

Ответ 3

Если вы просто хотите запустить обработчик, когда несколько клавиш нажимаются последовательно, попробуйте что-то вроде:

jQuery.multipress = function (keys, handler) {
    'use strict';

    if (keys.length === 0) {
        return;
    }

    var down = {};
    jQuery(document).keydown(function (event) {
        down[event.keyCode] = true;
    }).keyup(function (event) {
        // Copy keys array, build array of pressed keys
        var remaining = keys.slice(0),
            pressed = Object.keys(down).map(function (num) { return parseInt(num, 10); }),
            indexOfKey;
        // Remove pressedKeys from remainingKeys
        jQuery.each(pressed, function (i, key) {
            if (down[key] === true) {
                down[key] = false;
                indexOfKey = remaining.indexOf(key);
                if (indexOfKey > -1) {
                    remaining.splice(indexOfKey, 1);
                }
            }
        });
        // If we hit all the keys, fire off handler
        if (remaining.length === 0) {
            handler(event);
        }
    });
};

Например, для запуска на s-t,

jQuery.multipress([83, 84], function () { alert('You pressed s-t'); })

Ответ 4

Неа. keypress будет срабатывать для каждого нажатого отдельного ключа - кроме клавиш модификатора, таких как CTRL, ALT и SHIFT, вы можете комбинировать их с другими клавишами, если это только один другой ключ.

Ответ 5

По мере того, как мой срок истек (никто не использовал его:() Я решил обновить ответ с помощью большего количества решений 2017. Проверьте ниже.

Вы можете использовать мой плагин для jquery для обнаружения ярлыков.

Он в основном кэширует события и получает ключи, которые нажаты в данный момент. Если все клавиши нажаты, то срабатывает функция.

https://github.com/maciekpaprocki/bindShortcut (истек!)

У вас есть небольшое объяснение, как использовать его в файле readme. Надеюсь это поможет. Обратная связь более чем оценена.

Изменить 2017:

Это 2017, и нам не нужны плагины jQuery для решения подобных вещей. Короче вам понадобится что-то вроде этого:

let pressed = {};

document.addEventListener('keydown', (event) => {
   pressed[event.key] = true;
});
document.addEventListener('keyup', (event) => {
   delete pressed[event.key];
});

//and now write your code
document.addEventListener('keydown', (event) => {
  if(pressed[firstKey]&&pressed[secondKey]){
    //dosomething
  }
});

У старых браузеров могут быть некоторые причуды, однако из IE9 все должно работать нормально, за исключением предельных количеств ОС, которые не поддерживают делегирование правильного события (супер старый ubuntu и т.д.). Там нет способа исправить это в них, а не в браузере.

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

Подробнее: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names_and_Char_values