jQuery: détection cmd+clic ou ctrl+clic

j'ai les options de mon application web dans des onglets.

<ul id="tabs">
    <li><a href="a.php">aaa</a></li>
    <li><a href="b.php">bbb</a></li>
    <li><a href="c.php">ccc</a></li>
    <li><a href="d.php">ddd</a></li>
    <li><a href="e.php">eee</a></li>
</ul>

quand l'utilisateur clique sur n'importe quel onglet (dans la même fenêtre) il y a un effet fadeout que j'obtiens avec ce code, et ensuite une redirection automatique:

$('ul#tabs li a').click(function(e){
    if(e.which == 1) {
        var link = $(this).attr('href');
        $('#content').fadeOut('fast',function(){
            window.location = link;
        });
    }
});

cela fonctionne très bien, car il ignore le clic du milieu de la souris (lors de l'ouverture de l'option dans un nouvel onglet, l'effet ne doit pas être déclenché). Le problème est que, si j'ouvre l'onglet avec un clavier+souris combinaison, au lieu d'ouvrir un nouveau tab, il déclenche l'ensemble du code effet / redirection.

alors, comment puis-je détecter cela avec jQuery:

  • cmd + clic gauche de la souris (mac)
  • ctrl + clic gauche de la souris (windows/linux)
18
demandé sur Andres SK 2011-08-31 06:09:30

5 réponses

dans votre fonction click, does E. metaKey évalue à vrai? Si oui, vous y êtes.

19
répondu Mr. S 2011-08-31 03:01:39

Malheureusement, event.metaKey n'évalue pas à true sur Windows lorsque la touche ctrl est maintenue sur click.

Heureusement, event.ctrlKey est évalué à vrai dans ces situations. Aussi, vous pouvez envisager maj + clique dans votre gestionnaire d'événements.

ainsi, votre code javascript parfumé jQuery de plateforme croisée ressemblerait à quelque chose comme:

$('ul#tabs li a').on('click', function(e) {
    var link = $(this).attr('href');

    // Check "open in new window/tab" key modifiers
    if (e.shiftKey || e.ctrlKey || e.metaKey) {
      window.open(link, '_blank');
    } else {
      $('#content').fadeOut('fast',function(){
        window.location = link;
      });
    }
  }
});
27
répondu Leighton Wallace 2014-09-18 18:26:57

en utilisant E. metaKey ne fonctionne pas de la même façon sur windows, donc pour détecter Windows, vous pouvez utiliser l'objet navigator et voir si l'utilisateur clique sur la touche ctrl (la façon par défaut d'ouvrir un nouvel onglet).

$('ul#tabs li a').click(function(a){
  var href = $(this).attr('href');
  // check if user clicked with command key (for mac) or ctrl key (for windows)
  if(a.metaKey || (navigator.platform.toUpperCase().indexOf('WIN')!==-1 && a.ctrlKey)) {
    window.open(href,'_blank');
  } else {
    $('#content').fadeOut('fast', function(){
        window.location = href;
    });
  }
});
3
répondu Nish 2014-11-13 09:29:42

je sais que vous voulez utiliser jQuery, mais je donnerais Keymaster d'essayer:

https://github.com/madrobby/keymaster

c'est vraiment génial, je l'utilise pour un projet sur lequel je travaille et c'est génial.

1
répondu JP Silvashy 2011-08-31 02:16:23

selon MDN, l'événement.metaKey returns true pour les touche de commande sur Mac claviers et retourne true touches windows sur les claviers Windows.

enter image description here

donc, vous devriez aussi vérifier le ctrlKey propriété pour détecter la clé de contrôle.

if (event.ctrlKey || event.metaKey) {
    //ctrlKey to detect ctrl + click
    //metaKey to detect command + click on MacOS
    yourCommandKeyFunction();
} else {
    yourNormalFunction();
}
1
répondu gandhi_rahul 2018-07-02 10:59:58