Le clic de commande n'ouvre pas un nouvel onglet, mais le clic du milieu le fait

Sur mon site web, qui est un site JS d'une page utilisant Sammy.js et jQuery, lorsque je clique au milieu d'un lien avec une souris, le lien s'ouvre dans un nouvel onglet. Mais quand je commande-clique sur un Mac, ce n'est pas le cas. cela se produit à la fois dans Firefox et Chrome, donc je suppose que cela doit être selon les spécifications d'une certaine manière.

Cela se produit sur un Macbook Air (donc trackpad + bouton de commande). La plupart des sites fonctionnent très bien, le clic de commande étant identique au clic moyen normal.

Essayez-le vous-même: https://circleci.com . Commande-cliquez entre "A propos", " accueil "et" contact " et vous devriez rencontrer le problème - ils ne s'ouvrent pas dans de nouveaux onglets.

23
demandé sur Paul Biggar 2012-05-19 02:11:59

3 réponses

Spéculer ici, mais confirmera plus tard à partir d'un Mac.{[7] } Il a été confirmé que cela fonctionne sur un Mac.

Win ctrl + clic ou une commande Mac + clic est capté par un écouteur de clic" normal", tout comme un clic avec n'importe quelle autre touche de modification (alt+clic, Maj+clic, etc.).

Ceci est particulièrement déroutant car un ctrl + click sur un Mac est interprété comme un clic droit sur le niveau du système d'exploitation. D'un autre côté, le clic de commande est et non interprété comme un middle-click mais est plutôt une préférence de navigateur.

En supposant que vous n'avez pas de fonctionnalité sur le site qui repose spécifiquement sur des clics modifiés, il serait approprié d'exclure de tels événements des écouteurs de clics, et de les autoriser à être gérés nativement par le navigateur. Compte tenu de l'expérience de quelqu'un dans la situation similaire , Vous devriez être en mesure d'ajouter ce qui suit aux gestionnaires de clics (probablement un délégué au niveau de la bibliothèque comme indiqué par Brilliand):

if (e.metaKey || e.ctrlKey) return;

Lorsqu'il est ajouté au début du gestionnaire avec e faisant référence à un événement de clic en cours, cela devrait contourner tout e.preventDefault();

Mise à jour:

Ça marche vraiment! Dans ce violon plutôt minimaliste , je suis capable de reconnaître quand la commande a cliqué ou le contrôle a cliqué, afin d'éviter d'exécuter le reste du gestionnaire de clics qui inclut ajax-aller chercher le contenu et e.preventDefault();. Cela permet de gérer un clic de commande "comme prévu" sur un Mac, c'est-à-dire ouvrir le lien dans un nouvel onglet.

Avec cette conclusion à l'esprit, ces lignes {[19] } devraient maintenant lire

if (e.isDefaultPrevented() || e.metaKey || e.ctrlKey) {
    return;
}
33
répondu o.v. 2012-05-30 10:00:36

Il y a un aperçu intéressant ici: https://groups.google.com/forum/#! msg / mozilla. dev. usability/H1qLTur4EFc / gXH007CAPk8J

Apparemment, le JS que vous utilisez peut preventDefault() le cmd + clic alors que le clic du milieu n'est pas affecté. Consultez les documents de votre framework js / Site.

6
répondu dakdad 2012-05-20 03:43:56

Voici le code pertinent de sammy.js:

// bind to link clicks that have routes
$('a').live('click.history-' + this.app.eventNamespace(), function(e) {
    if (e.isDefaultPrevented()) {
        return;
    }
    var full_path = lp.fullPath(this);
    if (this.hostname == window.location.hostname && app.lookupRoute('get', full_path)) {
        e.preventDefault();
        proxy.setLocation(full_path);
        return false;
    }
});

Résumé: si quelqu'un clique sur un lien, remplacez le comportement de lien standard par sammy.le comportement de js, qui consiste à changer la page actuelle pour afficher le contenu de la page cible sans chargement de page réel. Selon le lien de dakdad, un clic de commande (contrairement à un clic du milieu) est intercepté par l'événement click et peut être remplacé.

Pour une solution de contournement, vous pouvez supprimer sammy.le gestionnaire d'événements de js (en utilisant $('a').die('click.history-' + _sammy_event_namespace_);) et le remplacer par un version modifiée qui vérifie les clics de commande et évite de les surcharger.

5
répondu Brilliand 2012-05-25 09:38:59