如果用户在您的网站上并在新选项卡中打开另一个链接(也指向您的网站),是否可以将此与仅正常单击该链接的用户区分开来?这可以在 javascript 中,在服务器上,等等。
我猜答案是你不能这样做,但我想仔细检查一下。
如果用户在您的网站上并在新选项卡中打开另一个链接(也指向您的网站),是否可以将此与仅正常单击该链接的用户区分开来?这可以在 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>
基本上,这会在用户第一次访问登录页面时设置窗口名称。登录后,对于每个后续页面加载,都会测试窗口名称。
两个问题:
JavaScript 中的 window.opener 属性将指向打开新窗口的窗口。但是,它不区分新窗口和新选项卡。选项卡不是官方 W3C 规范的一部分,因此没有对它们的直接支持。
最简洁的答案是不。长答案是,如果您正在从您的页面对服务器端方法进行 ajaxy 调用,这可能会使窗口保持打开状态(在短时间内调用)。这将是一个草率、不可靠的混乱,并且您无法区分新窗口或选项卡。
我真的不这么认为。据我所知,最接近的方法是监视按键和鼠标点击事件,以尝试将操作与在新选项卡中打开链接的常用方法相匹配。(即,如果他们在单击或中键时按住 Command,则可能是一个新选项卡)。但这并不可靠,因为这些绑定中的任何一个都可以更改。
这是客户端行为,所以我认为你可以用 javascript 做一些事情,比如检查浏览器历史记录,但是在新标签和新窗口之间是模棱两可的。
除此之外,并非所有浏览器都有选项卡,并且并非所有浏览器对选项卡的含义都相同(在某些过程中是不同的过程,而在另一些过程中则不是)。
但是,你为什么要检查呢?您的应用程序是否在新选项卡中执行真的很重要吗?我不这么认为...