112 votes

Comment puis-je vérifier si une touche est enfoncée pendant l'événement de clic avec jQuery ?

Je voudrais attraper un événement de clic avec jQuery et être capable de dire si une touche a été pressée en même temps afin que je puisse forker dans la fonction de rappel basée sur l'événement de pression de touche.

Par exemple :

$("button").click(function() {
    if([KEYPRESSED WHILE CLICKED]) {
        // Do something...
    } else {
        // Do something different...
    }
});

Est-ce possible ou comment le faire si c'est possible ?

183voto

kkyy Points 5540

Vous pouvez facilement détecter les touches shift, alt et control à partir des propriétés de l'événement ;

$("button").click(function(evt) {
  if (evt.ctrlKey)
    alert('Ctrl down');
  if (evt.altKey)
    alert('Alt down');
  // ...
});

Voir quirksmode pour d'autres propriétés. Si vous souhaitez détecter d'autres clés, consultez La réponse de cletus .

3 votes

Je ne vois pas cette propriété sur l'objet jQuery Event : api.jquery.com/category/events/event-object

1 votes

Comme le dit la page, "La plupart des propriétés de l'événement original sont copiées et normalisées dans le nouvel objet événement". ctrlKey, altKey etc. font partie de la norme ecmascript (voir le premier lien sur la page jquery api mentionnée ci-dessus), donc (au moins dans les navigateurs décents) l'objet événement a généralement aussi ces propriétés définies.

3 votes

Le mode "bizarreries" indique seulement que celles-ci sont définies sur un événement de touche aucune mention d'un événement de souris.

51voto

cletus Points 276888

Vous devez suivre séparément l'état des clés en utilisant keydown() et keyup() :

var ctrlPressed = false;
$(window).keydown(function(evt) {
  if (evt.which == 17) { // ctrl
    ctrlPressed = true;
  }
}).keyup(function(evt) {
  if (evt.which == 17) { // ctrl
    ctrlPressed = false;
  }
});

Voir le liste des codes clés . Vous pouvez maintenant le vérifier :

$("button").click(function() {
  if (ctrlPressed) {
    // do something
  } else {
    // do something else
  }
});

6 votes

L'inconvénient de cette méthode (je ne connais pas de meilleure méthode) est que si vous détectez la touche ALT et que l'utilisateur passe à une autre fenêtre avec ALT-Tabs, l'événement de frappe n'est pas détecté par le navigateur car il s'est produit dans une autre application. À partir de ce moment, jquery pense que la touche est enfoncée, jusqu'à ce que l'utilisateur appuie sur la touche dans votre application jquery. Cela ne concerne que la touche ALT, pour autant que je puisse imaginer.

1 votes

Pour Mac OS X, ce serait Cmd-Tab, mais je pense que le principe est toujours valable.

1 votes

Ou Ctrl+Tab pour changer l'onglet du navigateur.

9voto

Arun Prasad E S Points 3375

J'ai pu l'utiliser uniquement avec JavaScript

 <a  href="" onclick="return Show(event)"></a>

  function Show(event) {
            if (event.ctrlKey) { 
                 alert('Ctrl down');
            }
     }

4voto

vr_driver Points 133

Sans voler Le coup de tonnerre d'@Arun Prasad Voici un extrait JS pur que j'ai remanié pour arrêter l'action par défaut, qui ouvrirait autrement une nouvelle fenêtre si l'on appuie sur CTL+clic.

function Show(event) 
{
  if (event.ctrlKey) 
  {
    alert('Ctrl held down which clicked');
  } 
  else 
  {
    alert('Ctrl NOT pressed');
  }
  return false
}

<p>Hold down CTL on the link to get a different message</p>

<a href="" onclick="return Show(event)">click me</a>

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