35

ユーザーがあなたの Web サイトにいて、別のリンク (あなたの Web サイトへのリンク) を新しいタブで開いた場合、通常はリンクをクリックするだけのユーザーと区別できますか? これは、サーバー上で、javascript で行うことができます。

答えは、これはできないということだと思いますが、再確認したかったのです。

4

7 に答える 7

38

次のようにできます。

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

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

于 2009-05-11T21:05:56.383 に答える
12

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

したがって、onloadという名前があるかどうかを確認すると...最初のロードでは空白になるはずです...次に「foo」に設定すると...そのウィンドウでの後続のロードごとに...ウィンドウ。 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 の名前 (修正が期待されていない非常に奇妙なバグ)
于 2009-05-11T21:38:24.100 に答える
7

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

<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 を破棄して新しいセッションを開始できます。
于 2012-12-03T17:22:54.983 に答える
5

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

于 2009-05-11T21:06:31.453 に答える
3

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

于 2009-05-11T21:06:20.627 に答える
1

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

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

しかし、なぜそれを確認したいのですか?アプリケーションが新しいタブで実行されているかどうかは本当に重要ですか? 私はそうは思わない...

于 2009-05-11T21:09:22.510 に答える
1

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

于 2009-05-11T21:05:20.957 に答える