ユーザーがあなたの Web サイトにいて、別のリンク (あなたの Web サイトへのリンク) を新しいタブで開いた場合、通常はリンクをクリックするだけのユーザーと区別できますか? これは、サーバー上で、javascript で行うことができます。
答えは、これはできないということだと思いますが、再確認したかったのです。
ユーザーがあなたの Web サイトにいて、別のリンク (あなたの Web サイトへのリンク) を新しいタブで開いた場合、通常はリンクをクリックするだけのユーザーと区別できますか? これは、サーバー上で、javascript で行うことができます。
答えは、これはできないということだと思いますが、再確認したかったのです。
次のようにできます。
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
かもしれませんが、それが何であるかはわかりません。
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>
警告:
これは、認証されたユーザーが複数のタブを開くことを禁止するために 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 の window.opener プロパティは、新しいウィンドウを開いたウィンドウを指します。ただし、新しいウィンドウと新しいタブを区別しません。タブは公式の W3C 仕様の一部ではないため、直接サポートされていません。
簡単に言えば、いいえです。長い答えは、ページからサーバー側のメソッドへの ajaxy 呼び出しを行っている場合、ウィンドウが開いていることを追跡し続ける可能性があるということです (短い時間枠内で呼び出されます)。それはずさんで信頼性の低い混乱であり、新しいウィンドウかタブかを区別できませんでした。
これはクライアントの動作なので、ブラウザの履歴を確認するなど、javascriptで何かできると思いますが、新しいタブと新しいウィンドウの間があいまいです。
それに加えて、すべてのブラウザーにタブがあるわけではなく、すべてのブラウザーでタブの意味が同じであるとは限りません (プロセスが異なるものもあれば、そうでないものもあります)。
しかし、なぜそれを確認したいのですか?アプリケーションが新しいタブで実行されているかどうかは本当に重要ですか? 私はそうは思わない...
本当にそうは思いません。私が知る限り、キープレスとマウスクリックのイベントを監視して、新しいタブでリンクを開くための一般的な方法にアクションを一致させようとするのが最も近い方法です。(つまり、コマンドを押しながらクリックまたは中クリックした場合は、おそらく新しいタブです)。ただし、これらのバインディングは変更される可能性があるため、これは信頼できません。