tastetrykk - Oppdage tastetrykk på piltaster i JavaScript
Hvordan kan jeg oppdage når en av piltastene trykkes? Jeg brukte dette for å finne ut:
function checkKey(e) {
var event = window.event ? window.event : e;
console.log(event.keyCode)
}
Selv om det fungerte for alle andre taster, gjorde det det ikke for piltastene (kanskje fordi nettleseren skal rulle med disse tastene som standard).
Svar #1
Piltastene utløses bare av onkeydown, ikke onkeypress.
Tastkodene er:
- venstre=37
- opp=38
- høyre=39
- ned=40
Svar #2
event.key === "ArrowRight"...
Mer nylig og mye renere: bruk event.key. Ikke flere vilkårlige tallkoder! Hvis du transpilerer eller vet at brukerne dine alle bruker moderne nettlesere, bruk dette!
node.addEventListener('keydown', (event) => {
const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
});
Detaljert håndtering:
switch (event.key) {
case "ArrowLeft":
// Left pressed
break;
case "ArrowRight":
// Right pressed
break;
case "ArrowUp":
// Up pressed
break;
case "ArrowDown":
// Down pressed
break;
}
Moderne bryterhåndtering:
const callback = {
"ArrowLeft" : leftHandler,
"ArrowRight" : rightHandler,
"ArrowUp" : upHandler,
"ArrowDown" : downHandler,
}[event.key]
callback?.()
MERK: De gamle egenskapene (
.keyCodeog.which) er foreldet.
"w", "a", "s", "d" for retning, bruk event.code
For å støtte brukere som bruker ikke-qwerty/engelske tastaturoppsett, bør du i stedet bruke event.code. Dette vil bevare den fysiske tastenes plassering, selv om det resulterende tegnet endres.
event.key ville være , på Dvorak og z på Azerty, noe som gjør spillet ditt uspillbart.
const {code} = event
if (code === "KeyW") // KeyA, KeyS, KeyD
Optimalt sett lar du også tastendefinering, noe som gagner spilleren uavhengig av deres situasjon.
P.S. event.code er det samme for piler
tast Mozilla Docs
kode Mozilla Docs
Støttede nettlesere
Svar #3
Kall funksjon ved tast opp og ned. Det er forskjellige koder for hver tast.
document.onkeydown = checkKey;
function checkKey(e) {
e = e || window.event;
if (e.keyCode == 38) {
// up arrow
}
else if (e.keyCode == 40) {
// down arrow
}
else if (e.keyCode == 37) {
// left arrow
}
else if (e.keyCode == 39) {
// right arrow
}
}
Svar #4
Muligens den korteste formuleringen:
document.onkeydown = function(e) {
switch (e.keyCode) {
case 37:
alert('left');
break;
case 38:
alert('up');
break;
case 39:
alert('right');
break;
case 40:
alert('down');
break;
}
};
Demo (takk til brukeren Angus Grant): http://jsfiddle.net/angusgrant/E3tE6/
Dette bør fungere på tvers av nettlesere. Legg igjen en kommentar hvis det er en nettleser der det ikke fungerer.
Det finnes andre måter å få nøkkelkoden på (e.which, e.charCode, og window.event i stedet for e), men de burde ikke være nødvendige. Du kan prøve de fleste av dem på http://www.asquare.net/javascript/tests/KeyCode.html. Merk at event.keycode ikke fungerer med onkeypress i Firefox, men det fungerer med onkeydown.
Svar #5
Bruk keydown, ikke keypress for ikke-trykkbare taster som piltaster:
function checkKey(e) {
e = e || window.event;
alert(e.keyCode);
}
document.onkeydown = checkKey;
Den beste referansen for JavaScript-tastaturhendelser jeg har funnet (som slår quirksmode, for eksempel) er her: http://unixpapa.com/js/key.html
Svar #6
Moderne svar siden keyCode nå er utdatert til fordel for key:
document.onkeydown = function (e) {
switch (e.key) {
case 'ArrowUp':
// up arrow
break;
case 'ArrowDown':
// down arrow
break;
case 'ArrowLeft':
// left arrow
break;
case 'ArrowRight':
// right arrow
}
};
Svar #7
Jeg tror den nyeste metoden ville være:
document.addEventListener("keydown", function(event) {
event.preventDefault();
const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
switch (key) { // change to event.key to key to use the above variable
case "ArrowLeft":
// Left pressed
<do something>
break;
case "ArrowRight":
// Right pressed
<do something>
break;
case "ArrowUp":
// Up pressed
<do something>
break;
case "ArrowDown":
// Down pressed
<do something>
break;
}
});
Dette forutsetter at utvikleren ønsker at koden skal være aktiv hvor som helst på siden, og at klienten skal ignorere andre tastetrykk. Fjern linjen event.preventDefault(); hvis tastetrykk, inkludert de som fanges av denne handleren, fortsatt skal være aktive.
