Détection des pressions de touches fléchées en JavaScript

460

Comment détecter lorsque l'une des touches fléchées est enfoncée? Je l'ai utilisé pour découvrir:

function checkKey(e) {
    var event = window.event ? window.event : e;
    console.log(event.keyCode)
}

Bien que cela ait fonctionné pour toutes les autres clés, il ne l'a pas été pour les touches fléchées (peut-être parce que le navigateur est censé faire défiler ces touches par défaut).

mihsathe
la source

Réponses:

735

Les touches fléchées ne sont déclenchées que par onkeydown, pas onkeypress.

Les codes clés sont les suivants:

  • gauche = 37
  • up = 38
  • droite = 39
  • vers le bas = 40
Mark Kahn
la source
15
Certains navigateurs déclenchent des keypressévénements pour les touches fléchées, mais vous avez raison, cela keydownfonctionne toujours pour les touches fléchées.
Tim Down le
4
Si vous appuyez sur%, vous obtenez également keyCode 37
xorcus
9
@xorcus - Non, vous obtenez 53avec un keydownévénement. Vous obtenez 37avec keypress, ce qui est différent
Mark Kahn
7
Et onkeyup?
1nfiniti
2
@MrCroft - ou écoutez onkeyupet arrêtez l'événement là-bas. En réalité, vous ne devriez cependant pas modifier le comportement de l'interface utilisateur avec Javascript.
Mark Kahn
225

Fonction d'appel de haut en bas. Il existe différents codes pour chaque touche.

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
    }

}
ketan
la source
Que fait la deuxième ligne?
eshellborn
16
Pour clarifier, «e || window.event 'signifie que si' e 'est une valeur définie, ce sera le résultat de' || ' expression. Si 'e' n'est pas défini, 'window.event' sera le résultat de '||' expression. Donc, c'est essentiellement un raccourci pour: e = e ? e : window.event; Ou:if (typeof(e) === "undefined") { e = window.event; }
Michael Calvin
17
C'est pour le faire fonctionner sur les anciennes versions d'IE (pré IE9) où l'événement n'était pas passé dans la fonction de gestionnaire.
Mark Rhodes
12
Juste pour noter keyCode est un nombre et === devrait idéalement être utilisé
alexrogers
11
@ketan le point était que keyCode est un nombre et devrait être vérifié comme keyCode === 32, pas keyCode == '32'ou keyCode === '32'.
Nenotlep
98

event.key === "ArrowRight" ...

Plus récent et beaucoup plus propre: utilisation event.key. Plus de codes numériques arbitraires! Si vous transpilez ou savez que vos utilisateurs sont tous sur des navigateurs modernes, utilisez ceci!

node.addEventListener('keydown', function(event) {
    const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
});

Manipulation verbeuse:

switch (event.key) {
    case "ArrowLeft":
        // Left pressed
        break;
    case "ArrowRight":
        // Right pressed
        break;
    case "ArrowUp":
        // Up pressed
        break;
    case "ArrowDown":
        // Down pressed
        break;
}

Vous pouvez facilement l'étendre pour vérifier "w", "a", "s", "d", ou toute autre clé

Documents Mozilla

Navigateurs pris en charge

PS event.codeest le même pour les flèches

Gibolt
la source
5
Merci d'avoir utilisé keyet non keyCode, c'était obsolète.
v010dya
8
Remarque de MDN: Internet Explorer, Edge (16 et versions antérieures) et Firefox (36 et versions antérieures) utilisent "Gauche", "Droite", "Haut" et "Bas" au lieu de "ArrowLeft", "ArrowRight", "ArrowUp "et" ArrowDown ".
Simon
95

Peut-être la formulation la plus ters:

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;
    }
};

Démo (merci à l'utilisateur Angus Grant): http://jsfiddle.net/angusgrant/E3tE6/

Cela devrait fonctionner sur plusieurs navigateurs. Laissez un commentaire s'il existe un navigateur où il ne fonctionne pas.

Il existe d'autres façons d'obtenir le code clé (e.which, e.charCode et window.event au lieu de e), mais elles ne devraient pas être nécessaires. Vous pouvez en essayer la plupart sur http://www.asquare.net/javascript/tests/KeyCode.html . Notez que event.keycode ne fonctionne pas avec onkeypress dans Firefox, mais il fonctionne avec onkeydown.

1''
la source
3
J'ai dû chercher la définition de laconique , puis j'ai (avec enthousiasme) postulé que le concordance était une conjugaison incorrecte; hélas, je le concède: ma sollicitude était réfutable .
ashleedawg
20

Utilisez keydown, pas keypresspour les touches non imprimables telles que les touches fléchées:

function checkKey(e) {
    e = e || window.event;
    alert(e.keyCode);
}

document.onkeydown = checkKey;

La meilleure référence d'événement clé JavaScript que j'ai trouvée (en repoussant le pantalon par quirksmode, par exemple) est ici: http://unixpapa.com/js/key.html

Tim Down
la source
16

Réponse moderne puisque keyCode est désormais déconseillé en faveur de 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
    }
};
Joshua Fan
la source
12

Je pense que la méthode la plus récente serait:

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;
  }
});

Cela suppose que le développeur souhaite que le code soit actif n'importe où sur la page et que le client doit ignorer toute autre pression sur une touche. Éliminez l'événement.preventDefault (); si les touches, y compris celles prises par ce gestionnaire, doivent toujours être actives.

lrhorer
la source
9
function checkArrowKeys(e){
    var arrs= ['left', 'up', 'right', 'down'], 
    key= window.event? event.keyCode: e.keyCode;
    if(key && key>36 && key<41) alert(arrs[key-37]);
}
document.onkeydown= checkArrowKeys;
kennebec
la source
1
Ne vaut-il pas la peine de se mettre en arrsdehors de la fonction? Pas besoin de le recréer à chaque appel
Grief
8

Voici un exemple d'implémentation:

var targetElement = $0 || document.body;

function getArrowKeyDirection (keyCode) {
  return {
    37: 'left',
    39: 'right',
    38: 'up',
    40: 'down'
  }[keyCode];
}

function isArrowKey (keyCode) {
  return !!getArrowKeyDirection(keyCode);
}

targetElement.addEventListener('keydown', function (event) {
  var direction,
      keyCode = event.keyCode;

  if (isArrowKey(keyCode)) {
    direction = getArrowKeyDirection(keyCode);

    console.log(direction);
  }
});
RobPW
la source
Je reçois 0 $ n'est pas défini var targetElement = typeof $0 !== 'undefined' ? $0 : document.body; ou juste: var targetElement = document.body;est ok
papo
7

Voici comment je l'ai fait:

var leftKey = 37, upKey = 38, rightKey = 39, downKey = 40;
var keystate;
document.addEventListener("keydown", function (e) {
    keystate[e.keyCode] = true;
});
document.addEventListener("keyup", function (e) {
    delete keystate[e.keyCode];
});

if (keystate[leftKey]) {
//code to be executed when left arrow key is pushed.
}
if (keystate[upKey]) {
//code to be executed when up arrow key is pushed.
}
if (keystate[rightKey]) {
//code to be executed when right arrow key is pushed.
}
if (keystate[downKey]) {
//code to be executed when down arrow key is pushed.
}
OneStig
la source
5

J'ai pu les piéger avec jQuery:

$(document).keypress(function (eventObject) {
    alert(eventObject.keyCode);
});

Un exemple: http://jsfiddle.net/AjKjU/

Albireo
la source
4
keypressne fonctionnera pas avec les touches fléchées. Vous devez utiliser à la $(document).on('keydown', function() {...})place
Juribiyan
4

C'est le code de travail pour Chrome et Firefox

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

<script type="text/javascript">

    function leftArrowPressed() {
      alert("leftArrowPressed" );
      window.location = prevUrl  
    }

    function rightArrowPressed() {
      alert("rightArrowPressed" );
      window.location = nextUrl  
    }
    function topArrowPressed() {
      alert("topArrowPressed" );
      window.location = prevUrl  
    }

    function downArrowPressed() {
      alert("downArrowPressed" );
      window.location = nextUrl  
    }

        document.onkeydown = function(evt) {
                        var nextPage = $("#next_page_link")
                        var prevPage = $("#previous_page_link")
                        nextUrl = nextPage.attr("href")
                        prevUrl = prevPage.attr("href")
        evt = evt || window.event;
        switch (evt.keyCode) {
                case 37:
                leftArrowPressed(nextUrl);
                break;

                case 38:
                topArrowPressed(nextUrl);
                break;

                 case 39:
                rightArrowPressed(prevUrl);
                break;

                case 40:
                downArrowPressed(prevUrl);
                break;

        }
    };


</script>
</head>
<body>
<p>
<a id="previous_page_link" href="http://www.latest-tutorial.com">Latest Tutorials</a> 
<a id="next_page_link" href="http://www.zeeshanakhter.com">Zeeshan Akhter</a>
 </p>
</body>
</html>
Zeeshan Akhter
la source
3

Je cherchais également cette réponse jusqu'à ce que je tombe sur ce post.

J'ai trouvé une autre solution pour connaître le code clé des différentes clés, grâce à mon problème. Je voulais juste partager ma solution.

Utilisez simplement l'événement keyup / keydown pour écrire la valeur dans la console / alerte de la même manière event.keyCode. comme-

console.log(event.keyCode) 

// or

alert(event.keyCode)

- rupam

Rupam Datta
la source
3

C'est plus court.

function IsArrows (e) { return (e.keyCode >= 37 && e.keyCode <= 40); }

Andrey Vaganov
la source
2
court c'est bien:if ([37,38,39,40].indexOf(e.keyCode)!=-1){ console.log('arrow pressed') }
animaacija
3

Cette bibliothèque est géniale! https://craig.is/killing/mice

Mousetrap.bind('up up down down left right left right b a enter', function() {
    highlight([21, 22, 23]);
});

Vous devez cependant appuyer sur la séquence un peu rapidement pour mettre en surbrillance le code dans cette page.

Fandi Susanto
la source
2

Re répond que vous n'avez keydownpas besoin keypress.

En supposant que vous vouliez déplacer quelque chose en continu pendant que la touche est enfoncée, je trouve que cela keydownfonctionne pour tous les navigateurs sauf Opera. Pour Opera, keydownne se déclenche qu'au 1er appui. Pour permettre l'utilisation d'Opera:

document.onkeydown = checkKey;
document.onkeypress = checkKey;
function checkKey(e)
{ etc etc
Alan Finners
la source
2

Les touches fléchées sont déclenchées lors de la frappe

$(document).on("keyup", "body", function(e) {
 if (e.keyCode == 38) {
    // up arrow
    console.log("up arrow")
  }
  if (e.keyCode == 40) {
      // down arrow
      console.log("down arrow")
  }
  if (e.keyCode == 37) {
    // left arrow
    console.log("lefy arrow")
  }
  if (e.keyCode == 39) {
    // right arrow
    console.log("right arrow")
  }
})

onkeydown permet ctrl, alt, merde

onkeyup permet l'onglet, les flèches vers le haut, les flèches vers le bas, les flèches vers la gauche, les flèches vers le bas

batMan007
la source
1

Si vous utilisez jquery, vous pouvez également faire comme ça,

 $(document).on("keydown", '.class_name', function (event) {
    if (event.keyCode == 37) {
        console.log('left arrow pressed');
    }
    if (event.keyCode == 38) {
        console.log('up arrow pressed');
    }
    if (event.keyCode == 39) {
        console.log('right arrow pressed');
    }
    if (event.keyCode == 40) {
        console.log('down arrow pressed');
    }
 });
Kalyan Halder Raaz
la source
0

contrôler les codes clés %=37et &=38... et seulement les touches fléchées gauche = 37 haut = 38

function IsArrows (e) {
   return ( !evt.shiftKey && (e.keyCode >= 37 && e.keyCode <= 40)); 
}
Juver Paredes
la source
0

Si vous voulez détecter les touches fléchées mais n'avez pas besoin de spécificités en Javascript

function checkKey(e) {
   if (e.keyCode !== 38 || e.keyCode !== 40 || e.keyCode !== 37 || e.keyCode !== 39){
    // do something
   };
}
KitKit
la source
0

Avec clé et ES6.

Cela vous donne une fonction distincte pour chaque touche fléchée sans utiliser de commutateur et fonctionne également avec les touches 2,4,6,8 du pavé numérique lorsqu'il NumLockest activé .

const element = document.querySelector("textarea"),
  ArrowRight = k => {
    console.log(k);
  },
  ArrowLeft = k => {
    console.log(k);
  },
  ArrowUp = k => {
    console.log(k);
  },
  ArrowDown = k => {
    console.log(k);
  },
  handler = {
    ArrowRight,
    ArrowLeft,
    ArrowUp,
    ArrowDown
  };

element.addEventListener("keydown", e => {
  const k = e.key;

  if (handler.hasOwnProperty(k)) {
    handler[k](k);
  }
});
<p>Click the textarea then try the arrows</p>
<textarea></textarea>

volt
la source