web-dev-qa-db-ja.com

ユーザーが新しいタブでリンクを開いたかどうかを検出することは可能ですか?

ユーザーがあなたのウェブサイトにいて、新しいタブで(あなたのウェブサイトへの)別のリンクを開いた場合、これを通常のリンクをクリックするだけのユーザーと区別することは可能ですか?これは、サーバー上のJavaScriptで何でもかまいません。

答えはできないと思いますが、もう一度確認したいと思います。

30
swampsjohn

あなたはこのようにそれを行うことができます:

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

history.length1にする方法は他にもあるかもしれませんが、それが何であるかはわかりません。

33
RichieHindle

JavaScriptのhistory.lengthに加えて、ウィンドウの名前を読み書きできます。

したがって、onloadという名前があるかどうかを確認すると...最初のロードではshouldは空白になります...次に「」に設定するとfoo "...そのウィンドウでの後続のロードごとに... window.nameプロパティは" foo "を返します...新しいタブ/ウィンドウでリンクを開かない限り...その新しいウィンドウには名前を設定しないでください。

(もちろん、window.open(url、name、features);を介してポップアップを開く場合を除きます。これにより、名前を事前に設定できます)

<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>

警告:

  • あなたのページがすでに名前を持っているウィンドウ/フレームに最初にロードされた場合...物事は風変わりになります
  • ページに(名前の付いた)iframeがあり、それらのiframeをターゲットにしたリンクがある場合、IE7/8にバグがあり、ユーザーが新しいタブ/ウィンドウでそれらのリンクを開くと、新しいタブ/ウィンドウが「継承」します。最初にターゲットにされたiframeの名前(非常にODDバグで修正は期待されていません)
11
scunliffe

これは、認証されたユーザーが複数のタブを開くことを禁止するためにASP.NETMVCで使用するものです。

<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>

基本的に、これはユーザーがログインページに初めてアクセスしたときにウィンドウ名を設定します。ログイン後、後続のページの読み込みごとにウィンドウ名がテストされます。

2つの問題:

  • javaScriptが無効になっている場合は動作しません
  • 誤ってユーザーが元のタブを閉じてから、自分のWebサイトへの他のリンクをアドレスバーに貼り付けた場合、ユーザーは常にエラーページを受け取ります。ユーザーに回復の機会を与えるために、SingleTab.htmページに「ログアウト」リンクを含めました。これにより、ユーザーはセッションCookieを破棄して、新しいセッションを開始できます。
6
JustAMartin

JavaScriptのwindow.openerプロパティは、新しいウィンドウを開いたウィンドウを指します。ただし、新しいウィンドウと新しいタブは区別されません。タブは公式のW3C仕様の一部ではないため、タブを直接サポートすることはできません。

3
Paul Alexander

簡単な答えは、いいえです。長い答えは、ページからサーバー側のメソッドへのajaxy呼び出しを実行している場合、ウィンドウのttrackを開いたままにする可能性があるということです(短い時間枠内で呼び出されます)。それはずさんで信頼性の低い混乱になるでしょう、そしてあなたはそのことに関して新しいウィンドウとタブを区別することができませんでした。

2
Tracker1

私は本当にそうは思いません。私の知る限り、最も近いのは、キー押下イベントとマウスクリックイベントを監視して、新しいタブでリンクを開くための一般的な方法にアクションを一致させようとすることです。 (つまり、クリックしたとき、または中クリックしたときにCommandを押している場合は、おそらく新しいタブです)。ただし、これらのバインディングはいずれも変更される可能性があるため、これは信頼できません。

0
user64417

これはクライアントの動作なので、ブラウザの履歴を確認するなど、JavaScriptで何かできると思いますが、新しいタブと新しいウィンドウの間ではあいまいです。

それに加えて、すべてのブラウザにタブがあるわけではなく、すべてのブラウザがタブとは同じ意味を持つわけではありません(プロセスが異なる場合もあれば、そうでない場合もあります)。

しかし、なぜあなたはそれをチェックしたいのですか?アプリケーションが新しいタブで実行されているかどうかは本当に重要ですか?そうは思いません...

0
eKek0