35

如果用户在您的网站上并在新选项卡中打开另一个链接(也指向您的网站),是否可以将此与仅正常单击该链接的用户区分开来?这可以在 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.length1但我不知道它们可能是什么。

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

基本上,这会在用户第一次访问登录页面时设置窗口名称。登录后,对于每个后续页面加载,都会测试窗口名称。

两个问题:

  • 如果禁用 JavaScript,则无法正常工作
  • 如果用户错误地关闭了原始选项卡,然后在地址栏中粘贴了指向我网站的其他链接,用户将始终收到错误页面。为了给用户一个恢复的机会,我在 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

我真的不这么认为。据我所知,最接近的方法是监视按键和鼠标点击事件,以尝试将操作与在新选项卡中打开链接的常用方法相匹配。(即,如果他们在单击或中键时按住 Command,则可能是一个新选项卡)。但这并不可靠,因为这些绑定中的任何一个都可以更改。

于 2009-05-11T21:05:20.957 回答
1

这是客户端行为,所以我认为你可以用 javascript 做一些事情,比如检查浏览器历史记录,但是在新标签和新窗口之间是模棱两可的。

除此之外,并非所有浏览器都有选项卡,并且并非所有浏览器对选项卡的含义都相同(在某些过程中是不同的过程,而在另一些过程中则不是)。

但是,你为什么要检查呢?您的应用程序是否在新选项卡中执行真的很重要吗?我不这么认为...

于 2009-05-11T21:09:22.510 回答