Нет единственного хорошего способа решения этой проблемы, в основном это зависит от того, что вы будете делать с этими ключевыми входами.
Например, если он предназначен для управления постоянно обновляемой анимацией, то простые семафоры в словаре с {left: bool, right: bool, up: bool, down: bool}
устанавливаются на true
в keydown и на false
в ] keyup , и этого достаточно для проверки каждого кадра.
const directions = {
up: false,
right: false,
down: false,
left: false
};
onkeydown = e => {
const key = e.key.replace('Arrow', '').toLowerCase();
if(key in directions) {
e.preventDefault();
directions[key] = true;
}
};
onkeyup = e => {
const key = e.key.replace('Arrow', '').toLowerCase();
if(key in directions) {
e.preventDefault();
directions[key] = false;
}
};
const w = canvas.width = innerWidth;
const h = canvas.height = innerHeight;
const ctx = canvas.getContext('2d');
const character = {
x: w/2,
y: h/2,
update: function() {
const speed = 2;
// this is where we will check our keyboard's status
// we do it every frame
let dir_x = 0,
dir_y = 0;
dir_x += directions.left ? -1 : 0;
dir_x += directions.right ? 1 : 0;
dir_y += directions.up ? -1 : 0;
dir_y += directions.down ? 1 : 0;
this.x += dir_x * speed;
this.y += dir_y * speed;
},
draw: function() {
ctx.fillRect(this.x - 20, this.y-20, 40, 40);
}
};
function anim() {
character.update();
ctx.clearRect(0,0,w, h);
character.draw();
requestAnimationFrame(anim);
}
anim();
:root,body{margin:0px}
<canvas id="canvas"></canvas>
Однако, если вы не держите непрерывный цикл анимации и вам действительно нужно это событие для запуска сначала, затем в обработчике клавиш вам может понадобиться добавить логику
...
if(key in directions) {
e.preventDefault();
const changed = directions[key] !== true;
directions[key] = true;
if(changed) {
triggerChange(key);
}
}
, где triggerChange(key)
будет функцией, готовой для запуска вашего сольного действия.
const directions = {
up: false,
right: false,
down: false,
left: false
};
function triggerChange(dir) {
character.update();
}
onkeydown = e => {
const key = e.key.replace('Arrow', '').toLowerCase();
if (key in directions) {
e.preventDefault();
const changed = directions[key] !== true;
directions[key] = true;
if (changed) {
triggerChange(key);
}
}
};
onkeyup = e => {
const key = e.key.replace('Arrow', '').toLowerCase();
if (key in directions) {
e.preventDefault();
directions[key] = false;
}
};
const w = canvas.width = innerWidth;
const h = canvas.height = innerHeight;
const ctx = canvas.getContext('2d');
const character = {
x: w / 2,
y: h / 2,
update: function() {
const speed = 5;
// this is where we will check our keyboard's status
// we do it every frame
let dir_x = 0,
dir_y = 0;
dir_x += directions.left ? -1 : 0;
dir_x += directions.right ? 1 : 0;
dir_y += directions.up ? -1 : 0;
dir_y += directions.down ? 1 : 0;
this.x += dir_x * speed;
this.y += dir_y * speed;
},
draw: function() {
ctx.fillRect(this.x - 20, this.y - 20, 40, 40);
}
};
function anim() {
// it is now keydown that is responsible for character.update()
ctx.clearRect(0, 0, w, h);
character.draw();
requestAnimationFrame(anim);
}
anim();
:root,body{margin:0}
<canvas id="canvas"></canvas>
Взятый от lytebyte, у Вас есть две опции:
Зависит от того, где/почему Вы щелкаете правой кнопкой.
ключ контекстного меню справа от клавиатуры в наше время, обычно между ключом Windows и Клавишей CTRL справа от Вашей клавиши "Пробел". Это откроет контекстное меню везде, где текущий фокус (обычно в текстовом редакторе).
при использовании правой кнопки мыши только для открытия инструментов рефакторинга, можно использовать Ctrl +. (период управления) для сования открывают "smart tag" на любом идентификаторе. Это доберется, Вы "генерируете пункт меню" тупика метода и т.п..
Ваша клавиатура имеет дополнительные ключи 'Windows', т.е. логотип Windows (Запустите ключ), и тот на правой стороне клавиши "Пробел", которая похожа на меню? Вызовите ту кнопку, на правой стороне 'Ключ контекстного меню'.
Посмотрите ключ между правым ключом 'Windows' стороны и ключом 'Ctrl'? Windows Keyboard layout
, Если Вашей клавиатуре меньше чем 10 лет, у Вас должны быть эти ключи, если у Вас нет ноутбука IBM или Mac.!
Принятие Вас просто хочет клавишу, которую можно нажать для щелчка правой кнопкой, most\many клавиатуры имеют ключ между высоким звуком и ctrl, который щелкает правой кнопкой.