2009-09-09 5 views
376

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

Répondre

476
$(document).keydown(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) 
}); 

Mettez votre code personnalisé pour les touches fléchées entre les case et break lignes correspondantes.

e.which est normalisé par jQuery, donc il fonctionne dans tous les navigateurs. Pour une approche purement javascript, remplacer les deux premières lignes avec:

document.onkeydown = function(e) { 
    e = e || window.event; 
    switch(e.which || e.keyCode) { 


(modifier 2017)
Si vous vous sentez de fantaisie, vous pouvez utiliser e.key au lieu de e.which ou e.keyCode maintenant. e.key devient une norme recommandée, vous permettant de vérifier par rapport aux chaînes: 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'. Les nouveaux navigateurs le supportent nativement, check here.

+27

De loin la meilleure réponse. Utilise 'e.which' comme jQuery recommande pour cross-browser, utilise' e.preventDefault() 'au lieu de' return false' ('return false' sur un gestionnaire d'événement jQuery déclenche à la fois' e.preventDefault() 'et' e .stopPropagation() ', dont la seconde va provoquer l'échec des événements ajoutés ultérieurement car l'événement ne se propagera pas à eux), et à la fin du commutateur, retournera * sans * appeler' e.preventDefault () 'si c'est n'importe quelle autre clé que celles qui sont recherchées pour ne pas gêner l'utilisation d'autres clés, et au lieu de' $ .ui.keyCode.DOWN', elle se compare aux nombres (beaucoup plus rapidement). –

+0

Où trouvez-vous ces codes clés? –

+2

Nathan: il semble que tous les keycodes ne sont pas cohérents parmi les navigateurs, mais les touches fléchées sont parmi celles qui le sont. Voir ici: http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes – Sygmoral

441
$(document).keydown(function(e){ 
    if (e.keyCode == 37) { 
     alert("left pressed"); 
     return false; 
    } 
}); 

codes de caractères:

37 - left

38 - up

39 - right

40 - down

+4

Y at-il pour but le retour? –

+18

Il arrête tout autre événement de clavier touché. –

+1

Oh c'est vrai ... Je l'ai juste écrit avec un interrupteur et casse. –

100

Vous pouvez utiliser le code d'activation des touches fléchées (37, 38, 39 et 40 pour la gauche, en haut, à droite et en bas):

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

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

Vérifiez l'exemple ci-dessus here.

+1

Je ne suis pas sûr de votre utilisation du || opérateur dans la ligne 2. Une valeur autre que zéro ou une implémentation différente de zéro n'est-elle pas spécifique et non garantie? Je voudrais utiliser quelque chose de plus comme: var keyCode = (e.keyCode? E.keyCode: e.which); +1 pour l'utilisation de l'objet fléché pour donner les noms lisibles des cas. – Mnebuerquo

+5

Si vous utilisez jQuery, vous n'avez pas besoin de tester pour ce qui suit: 'L'événement.que la propriété normalise event.keyCode et event.charCode' - http://api.jquery.com/event.which/ – JCM

+0

I ' m essayant de placer un écouteur d'événement clé sur une table, mais cela ne fonctionnerait pas. Existe-t-il un nombre limité de types de sélecteurs prenant en charge les écouteurs d'événements clés? –

9

Etes-vous sûr que jQuery.HotKeys ne prend pas en charge les touches fléchées? J'ai déjoué leur démo avant et j'ai observé gauche, droite, haut et bas fonctionnant quand je l'ai testé dans IE7, Firefox 3.5.2, et Google Chrome 2.0.172 ...

EDIT: It Apparaît jquery.hotkeys a été déplacé vers Github: https://github.com/jeresig/jquery.hotkeys

+0

Je lisais où il était dit qu'il était basé sur une autre bibliothèque, et supposait que la liste des clés supportées s'appliquait toujours. –

22

Ceci est un peu en retard, mais HotKeys a un bogue très important qui provoque l'exécution des événements plusieurs fois si vous attachez plus d'un raccourci à un élément. Utilisez simplement jQuery.

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

+1 pour l'utilisation de l'objet code-clé ui. Beaucoup plus facile à comprendre que 37, 38, 39 ou 40. Je ne sais pas pourquoi la meilleure réponse utilise e.keyCode lorsque la documentation de jQuery stipule explicitement d'utiliser e.which pour tenir compte des différences de navigateur. J'espère que cette réponse sera mieux reconnue pour bien faire les choses. –

+1

L'utilisation de $ .ui.keyCode.DOWN à chaque appui sur une touche est beaucoup plus lente que l'utilisation du numéro. Ajoutez simplement un commentaire si vous êtes préoccupé par la clarté, d'autant plus qu'il doit être exécuté à chaque fois que vous appuyez sur une touche. –

5

Au lieu d'utiliser return false; comme dans les exemples ci-dessus, vous pouvez utiliser e.preventDefault(); qui fait la même chose, mais est plus facile à comprendre et à lire.

+4

'return false;' et 'e.preventDefault();' ne sont pas exactement identiques. Voir http://stackoverflow.com/a/1357151/607874 –

16

J'ai simplement combiné les meilleurs morceaux 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

D'où vient "ui"? Obtenir "TypeError: $ .ui est indéfini" EDIT - Il me manquait l'interface utilisateur JQuery. J'ai chargé ça - plus d'erreur. –

+1

Il semble également utiliser l'interface utilisateur jQuery qui doit avoir cette énumération. Je ne voudrais pas inclure l'interface utilisateur jQuery juste pour cela, btw. –

14

Vous pouvez utiliser KeyboardJS. J'ai écrit la bibliothèque pour des tâches comme celle-ci.

KeyboardJS.on('up', function() { console.log('up'); }); 
KeyboardJS.on('down', function() { console.log('down'); }); 
KeyboardJS.on('left', function() { console.log('right'); }); 
KeyboardJS.on('right', function() { console.log('left'); }); 

Commander la bibliothèque ici =>http://robertwhurst.github.com/KeyboardJS/

10

Une solution laconique en utilisant simplement Javascript (grâce à des améliorations proposées Sygmoral):

document.onkeydown = function(e) { 
    switch (e.keyCode) { 
     case 37: 
      alert('left'); 
      break; 
     case 39: 
      alert('right'); 
      break; 
    } 
}; 

Voir aussi https://stackoverflow.com/a/17929007/1397061.

+0

Probablement aussi dignes de liaison via 'document.addEventListener ('keydown', myFunction);' – nathanbirrell

3

Vous pouvez utiliser bind jQuery:

$(window).bind('keydown', function(e){ 
    if (e.keyCode == 37) { 
     console.log('left'); 
    } else if (e.keyCode == 38) { 
     console.log('up'); 
    } else if (e.keyCode == 39) { 
     console.log('right'); 
    } else if (e.keyCode == 40) { 
     console.log('down'); 
    } 
}); 
-1

Avec café & Jquery

$(document).on 'keydown', (e) -> 
    switch e.which 
     when 37 then console.log('left key') 
     when 38 then console.log('up key') 
     when 39 then console.log('right key') 
     when 40 then console.log('down key') 
    e.preventDefault() 
2

Vous pouvez vérifier wether un arrow key est pressé par:

$(document).keydown(function(e){ 
    if (e.keyCode > 36 && e.keyCode < 41) { 
     alert("arrowkey pressed"); 
     return false; 
    } 
}); 
0

empêchent la flèche uniquement disponible pour les un autre objet SELECT, eh bien en fait je n'ai pas tes sur un autre objet LOL. mais il peut arrêter l'événement de flèche sur la page et le type d'entrée. J'essaie déjà de bloquer les flèches gauche et droite pour changer la valeur de l'objet SELECT en utilisant "e.preventDefault()" ou "return false" sur les événements "kepress" "keydown" et "keyup" mais cela change encore la valeur de l'objet. mais l'événement vous dit encore que la flèche a été pressée.

0

Une bibliothèque Javascript robuste pour saisir les entrées au clavier et les combinaisons de touches entrées. Il n'a pas de dépendances.

http://jaywcjlove.github.io/hotkeys/

hotkeys('right,left,up,down', function(e, handler){ 
    switch(handler.key){ 
     case "right":console.log('right');break 
     case "left":console.log('left');break 
     case "up":console.log('up');break 
     case "down":console.log('down');break 
    } 
}); 
0

Je suis venu ici à la recherche d'un moyen simple de laisser l'utilisateur, lorsqu'elle se concentre sur une entrée, utilisez les touches fléchées pour +1 ou -1 une entrée numérique. Je n'ai jamais trouvé une bonne réponse mais j'ai fait le code suivant qui semble bien fonctionner - en faire tout le site maintenant.

$("input").bind('keydown', function (e) { 
    if(e.keyCode == 40 && $.isNumeric($(this).val())) { 
     $(this).val(parseFloat($(this).val())-1.0); 
    } else if(e.keyCode == 38 && $.isNumeric($(this).val())) { 
     $(this).val(parseFloat($(this).val())+1.0); 
    } 
}); 
3

Exemple de js pur à aller à droite ou à gauche

 window.addEventListener('keydown', function (e) { 
      // go to the right 
      if (e.keyCode == 39) { 

      } 
      // go to the left 
      if (e.keyCode == 37) { 

      } 
     }); 
Questions connexes