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).

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

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
    }

}

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


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.


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


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

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.


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;

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

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

5

J'ai pu les piéger avec jQuery:

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

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


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>

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


3

C'est plus court.

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


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.


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

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


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

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

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

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>

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.