438 votes

Lier les touches fléchées en JS/jQuery

Comment faire pour lier une fonction aux touches fléchées gauche et droite en Javascript et/ou jQuery ? J'ai regardé le plugin js-hotkey pour jQuery (il enveloppe la fonction intégrée bind pour ajouter un argument permettant de reconnaître des touches spécifiques), mais il ne semble pas prendre en charge les touches fléchées.

0 votes

0 votes

@Alex83690 Cette question a été postée bien après celle-ci...

567voto

Sygmoral Points 1982
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

Si vous devez supporter IE8, commencez le corps de la fonction comme suit e = e || window.event; switch(e.which || e.keyCode) { .

(edit 2020)
Notez que KeyboardEvent.which est maintenant déprécié. Voir cet exemple utilisant KeyboardEvent.key pour une solution plus moderne de détection des touches fléchées.

29 votes

De loin la meilleure réponse. Utilise e.which comme le recommande jQuery pour le cross-browser, utilise e.preventDefault() au lieu de return false ( return false sur un gestionnaire d'événements jQuery déclenche à la fois e.preventDefault() y e.stopPropagation() (le second va faire échouer tous les événements ajoutés ultérieurement puisque l'événement ne se propagera pas jusqu'à eux), et à la fin du commutateur, il retournera sans en appelant e.preventDefault() s'il s'agit d'une clé autre que celles recherchées pour ne pas gêner l'utilisation d'autres clés, et au lieu de $.ui.keyCode.DOWN il se compare aux chiffres (BEAUCOUP plus rapide).

2 votes

Nathan : il semble que tous les codes de touches ne soient pas cohérents entre les navigateurs, mais les touches fléchées font partie de ceux qui le sont. Voir ici : stackoverflow.com/questions/5603195/

0 votes

Merci, @Sygmoral ! Très utile, et +1 pour votre réponse. Ça a marché comme sur des roulettes.

463voto

Josh Points 8217
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

Codes de caractères :

37 - gauche

38 - haut

39 - droite

40 - en bas

4 votes

Y a-t-il un but à ce retour ?

20 votes

Cela empêche tout autre événement d'enfoncement de touche.

9 votes

Shadow : non, il veut dire que cela empêche l'événement keydown de se déclencher sur d'autres éléments du DOM.

109voto

CMS Points 315406

Vous pouvez utiliser le keyCode des touches fléchées (37, 38, 39 et 40 pour gauche, haut, droite et bas) :

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

Vérifiez l'exemple ci-dessus aquí .

1 votes

Je ne suis pas sûr de l'utilisation que vous faites de l'opérateur || à la ligne 2. Une valeur autre que zéro ou non nulle n'est-elle pas spécifique à l'implémentation et non garantie ? J'utiliserais plutôt quelque chose comme : var keyCode = (e.keyCode?e.keyCode:e.which) ; +1 pour l'utilisation de l'objet flèche pour donner des noms lisibles aux cas.

6 votes

Si vous utilisez jQuery, vous n'avez pas besoin de tester par exemple : The event.which property normalizes event.keyCode and event.charCode - api.jquery.com/event.which

0 votes

J'essaie de mettre un écouteur d'événement clé sur une table, mais cela ne fonctionne pas. Y a-t-il un nombre limité de types de sélecteurs qui prennent en charge les récepteurs d'événements clés ?

23voto

mackstann Points 327

C'est un peu tard, mais HotKeys a un bug très important qui fait que les événements sont exécutés plusieurs fois si vous attachez plus d'une touche de raccourci à un élément. Utilisez simplement jQuery.

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2 votes

+1 pour l'utilisation de l'objet keycode ui. Beaucoup plus facile à comprendre que 37, 38, 39 ou 40. Je ne sais pas pourquoi la première réponse utilise e.keyCode alors que la documentation de jQuery indique explicitement qu'il faut utiliser e.which pour tenir compte des différences entre les navigateurs. J'espère que cette réponse obtiendra plus de reconnaissance pour avoir fait les choses correctement.

2 votes

L'utilisation de $.ui.keyCode.DOWN à chaque pression de touche est BEAUCOUP plus lente que l'utilisation du nombre. Ajoutez simplement un commentaire si vous êtes soucieux de la clarté, en particulier parce qu'il doit être exécuté à chaque fois qu'une touche est enfoncée.

16voto

matt burns Points 6072

J'ai simplement combiné les meilleurs éléments des autres réponses :

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1 votes

D'où vient le terme "ui" ? J'obtiens " TypeError : $.ui is undefined " EDIT - Il me manquait JQuery UI. Je l'ai chargé - plus d'erreur.

3 votes

Apparemment, il utilise aussi jQuery UI qui doit avoir cet enum. Je n'inclurais pas jQuery UI juste pour ça, d'ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X