Est-il possible de détecter si un utilisateur a ouvert un lien dans un nouvel onglet?

Si un utilisateur est sur votre site web et ouvre un autre lien (également vers votre site Web) dans un nouvel onglet, est-il possible de le différencier de l'utilisateur en cliquant simplement sur le lien normalement? Cela peut être en javascript, sur le serveur, peu importe.

Je suppose que la réponse est que vous ne pouvez pas faire cela, mais je voulais vérifier.

30
demandé sur swampsjohn 2009-05-12 01:00:46

7 réponses

Vous pouvez le faire comme ceci:

if (history.length == 1) {  // Um, needs to be 0 for IE, 1 for Firefox
    // This is a new window or a new tab.
}

, Il peut y avoir d'autres façons de history.length à 1, mais je ne sais pas ce qu'ils pourraient être.

34
répondu RichieHindle 2009-05-11 21:05:56

En plus de l'histoire.longueur en JavaScript, vous pouvez lire / écrire le nom de la fenêtre.

Ainsi, si vous vérifiez s'il a un nom onload... IL devrait être vide sur la toute première charge... si vous le définissez sur "foo"... sur chaque charge suivante dans cette fenêtre... le window.name propriété retournera "foo"... sauf si vous ouvrez un lien dans un nouvel onglet/fenêtre... cette nouvelle fenêtre devriez pas avoir de nom.

(sauf si bien sûr vous ouvrez une fenêtre contextuelle via la fenêtre.ouvert (url, nom, fonctionnalités); qui vous pouvez définir le nom)

<script>
 if(window.name == ''){
   //first load (or Nth load in a new Tab/Window)
   if(!SOME_VALUE_SET_FOR_2ND_TO_NTH_LOADS){
     //set name so we can catch new Tab/Window
     window.name = 'myWinName';
   } else {
     //we have a new Tab/Window (or something funky)
     alert('What?! One window not cool enough for ya?\n' +
       'Calling the InterWeb Police!');
   }
 } else if(window.name == 'myWinName'){
   //2nd-Nth load
   document.title = 'All is well... we think';
 }
</script>

Mises en garde:

  • si votre page est initialement chargée dans une fenêtre / cadre qui avait déjà un nom... les choses vont devenir excentriques
  • Si votre page a des iframes (nommées) et que vous avez des liens ciblés dans ces iframes, il y a un bug dans IE7/8 par lequel lorsque l'utilisateur ouvre ces liens dans un nouvel onglet/Fenêtre, le nouvel onglet/Fenêtre "héritera" le nom de l'iframe qui a été ciblé à l'origine (bug très étrange sans attendu)
11
répondu scunliffe 2009-05-11 21:38:24

C'est ce que j'utilise dans ASP.NET MVC pour interdire aux utilisateurs authentifiés d'ouvrir plusieurs onglets:

<script language="javascript" type="text/javascript">
    @if(Request.IsAuthenticated)
    {
        <text>
        if (window.name != 'singleWindow') {
            window.location.href = "Content/ErrorPages/SingleTab.htm";
        } 
        </text>
    }
    else
    {
        <text>
        window.name = "singleWindow";
        </text>
    }
</script>

Fondamentalement, cela définit le nom de la fenêtre pour la première fois lorsque l'utilisateur visite la page de connexion. Après la connexion, pour chaque chargement de page suivant, le nom de la fenêtre est testé.

Deux problèmes:

  • ne wok pas si JavaScript désactivé
  • si par erreur l'utilisateur ferme l'onglet d'origine et ensuite colle quelque autre lien sur mon site dans la barre d'adresse, l'utilisateur aura toujours recevez la page d'erreur. Pour donner à l'utilisateur une chance de récupérer, j'ai inclus le lien "Déconnexion" dans le SingleTab.HTM page, de sorte que l'utilisateur peut détruire son cookie de session et commencer une nouvelle session.
6
répondu JustAMartin 2012-12-03 17:22:54

La fenêtre.la propriété opener en JavaScript pointera vers la fenêtre qui a ouvert la nouvelle fenêtre. Cependant, il ne fait pas la distinction entre une nouvelle fenêtre et un nouvel onglet. Les onglets ne font pas partie de la spécification officielle du W3C, donc il n'y a pas de support direct pour eux.

3
répondu Paul Alexander 2009-05-11 21:06:31

La réponse courte est non. La réponse longue est, si vous faites un appel ajaxy de vos pages vers des méthodes côté serveur, cela pourrait garder ttrack des fenêtres ouvertes (appelées dans un court laps de temps). Ce serait un désordre bâclé et peu fiable, et vous ne pouviez pas faire la différence entre une nouvelle fenêtre ou un onglet d'ailleurs.

2
répondu Tracker1 2009-05-11 21:06:20

Je ne pense vraiment pas. Le plus proche que vous pourriez obtenir autant que je sache est la surveillance des événements keypress et mouseclick pour essayer de faire correspondre les actions aux méthodes communes pour ouvrir des liens dans de nouveaux onglets. (IE. s'ils tiennent la commande quand ils cliquent, ou cliqués au milieu, c'est probablement un nouvel onglet). Ce ne serait pas fiable cependant, car l'une de ces liaisons peut être modifiée.

0
répondu Burke 2009-05-11 21:05:20

C'est le comportement du client, donc je pense que vous pourriez faire quelque chose avec javascript, comme vérifier l'historique du navigateur, mais il est ambigu entre un nouvel onglet et une nouvelle fenêtre.

À côté de cela, tous les navigateurs n'ont pas d'onglets et tous les navigateurs n'ont pas la même signification pour ce qu'est un onglet (dans certains processus différents, dans d'autres ils ne le sont pas).

Mais, pourquoi voudriez-vous vérifier? Peu importe si votre application s'exécute dans un nouvel onglet ou non? Je ne le pense pas...

0
répondu eKek0 2009-05-11 21:09:22