Есть ли способ для jQuery обнаружить, что одновременно было нажато несколько клавиш?
Есть ли какая-либо альтернатива, которая позволяет одновременно нажимать две клавиши?
Есть ли способ для jQuery обнаружить, что одновременно было нажато несколько клавиш?
Есть ли какая-либо альтернатива, которая позволяет одновременно нажимать две клавиши?
Чтобы обнаружить несколько удерживаемых нажатий клавиш, используйте события 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 клавиш.
Это зависит. Для "нормальных" клавиш это означает, что не- Shift, Ctrl, ALT, (CMD) ответ отрицательный, обработчик события будет захватывать/запускать в очереди один за другим.
Для ключей модификатора, о которых я упоминал выше, в объекте события есть свойство.
Пример:
$(document).bind('keypress', function(event) {
if( event.which === 65 && event.shiftKey ) {
alert('you pressed SHIFT+A');
}
});
Другие свойства:
event.ctrlKey
event.altKey
event.metaKey
Если вы просто хотите запустить обработчик, когда несколько клавиш нажимаются последовательно, попробуйте что-то вроде:
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'); })
Неа. keypress
будет срабатывать для каждого нажатого отдельного ключа - кроме клавиш модификатора, таких как CTRL, ALT и SHIFT, вы можете комбинировать их с другими клавишами, если это только один другой ключ.
По мере того, как мой срок истек (никто не использовал его:() Я решил обновить ответ с помощью большего количества решений 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