Обнаружение клавиши "Влево" или "Вправо" в нажатие клавиши - 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