Обнаружение клавиши "Влево" или "Вправо" в нажатие клавиши - JQuery
Я разрабатываю веб-приложение, где пользователю нужно вводить заглавные буквы. Я ограничил их использованием правой клавиши shift для некоторого ключа, например, a, s, d, f и левого сдвига для h, j, k, l (в основном, чтобы определить, использует ли пользователь правильную клавишу переключения для заглавных букв)/p >
Следующий код JQuery помогает найти, какой ключ нажат, включая цифры, малые и заглавные буквы. Но он не говорит мне, использовал ли он левую/правую клавишу сдвига для заглавных букв
$(document).keypress(function(event){
alert(String.fromCharCode(event.which));
});
После многого поиска я нашел код для проверки обнаружения клавиши сдвига влево/вправо
document.addEventListener("keyup", function(e){
var key = e.key + e.location;
if(key == "Shift1")
alert('Left shift key');
if(key == "Shift2")
alert('Right shift key');
});
Как я могу изменить JQuery script так, чтобы всякий раз, когда нажата заглавная буква, я могу проверить, нажал ли он нажатием левой или правой клавиши shift
Ответы
Ответ 1
Из небольшой помощи @Micheal Nakayama я сделал это сам. Вот код:
<script>
var shiftLeft
var shiftRight
document.addEventListener("keydown", function(e){
var key = e.key + e.location;
if(key=="Shift1")
{
shiftLeft = 1
}
else if(key=="Shift2")
{
shiftRight = 1
}
else if(shiftLeft==1)
{
console.log("Left+"+e.key)
}
else if(shiftRight==1)
{
console.log("Right+"+e.key)
}
else {
console.log(e.key)
}
});
document.addEventListener("keyup", function(e){
var key = e.key + e.location;
if(key=="Shift1")
{
shiftLeft = 0
}
else if(key=="Shift2")
{
shiftRight = 0
}
});
</script>
Ответ 2
Вы хотите проверить, нажата ли клавиша нажата, и сохранить нажатые клавиши в ассоциативном массиве и проверить, являются ли они истинными, когда нажаты другие клавиши, поэтому:
var pressedKeys = [];
var shift1Keys = []; //array of keys that are valid for shift1;
var shift2Keys = []; //array of keys that are valid for shift2;
document.addEventListener("keydown", function(e){
var key = e.key + e.location;
if(key === "Shift1") {
pressedKeys['shift1'] = true;
} else if(key === "Shift2") {
pressedKeys['shift2'] = true;
} else {
pressedKeys[key] = true;
if(pressedKeys['shift1'] && shift1keys.indexOf(key) !== -1) {
alert('shift1 and key pressed');
} else if (pressedKeys['shift2'] && shift2keys.indexOf(key) !== -1) {
alert('shift2 and key pressed');
}
}
});
document.addEventListener("keyup", function(e){
var key = e.key + e.location;
if(key == "Shift1") {
pressedKeys['shift1'] = false;
} else if(key == "Shift2") {
pressedKeys['shift2'] = false;
} else {
pressedKeys[key] = false;
}
});
Ответ 3
Другие решения здесь не охватывают крайний регистр удерживаемых ключей сдвига, которые могут не соответствовать, как вы ожидаете.
С точки зрения браузера,
- вторая сменная клавиша, которая будет удерживаться, выигрывает повторные нажатия клавиш
- вторая клавиша переключения, которая будет выпущена, выигрывает keyup
Это означает, что для соответствия поведению вы должны отбросить предыдущие местоположения в каждом месте вниз, вот пример такой реализации, которая регистрируется только при использовании ключей вдоль стороны Shift
function tellMeWhere(type, e, meta) {
if (e.shiftKey) {
console.log(e.key, type + '\'d', 'with Shift', meta.Shift)
}
}
(function (callback) {
var metaKeyList = ['Alt', 'Control', 'Meta', 'Shift'],
metaKeys = {};
window.addEventListener('keydown', function (e) {
if (metaKeyList.indexOf(e.key) !== -1) {
metaKeys[e.key] = e.location;
} else {
callback('down', e, Object.assign({}, metaKeys));
}
});
window.addEventListener('keypress', function (e) {
if (metaKeyList.indexOf(e.key) === -1) {
callback('press', e, Object.assign({}, metaKeys));
}
});
window.addEventListener('keyup', function (e) {
if (metaKeyList.indexOf(e.key) !== -1) {
delete metaKeys[e.key];
} else {
callback('up', e, Object.assign({}, metaKeys));
}
});
}(tellMeWhere));
Затем скажем, что вы набрали Left Shift A, выше было бы log
A down'd with Shift 1
A press'd with Shift 1
A up'd with Shift 1
Затем скажем, что вы набрали Right Shift Z, выше было бы log
Z down'd with Shift 2
Z press'd with Shift 2
Z up'd with Shift 2