是否可以检测用户是否在新标签中打开了链接?

swa*_*ohn 30 javascript tabs

如果用户在您的网站上并在新标签页中打开另一个链接(也是您的网站),是否可以将其与用户区别开来?这可以是javascript,在服务器上,无论如何.

我猜答案是你不能这样做,但我想仔细检查一下.

Ric*_*dle 33

你可以像这样做:

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

可能还有其他的途径history.length1,但我不知道他们可能是什么.


scu*_*ffe 11

除了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>
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 如果您的页面最初是在一个已经有名字的窗口/框架中加载的......事情会变得古怪
  • 如果您的页面有(命名)iframe,并且您有任何指向这些iframe的链接,那么IE7/8中存在一个错误,当用户在新标签/窗口中打开这些链接时,新标签/窗口将"继承"最初定位的iframe的名称(非常ODD错误,没有预期的修复)


Jus*_*tin 6

这是我在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>
Run Code Online (Sandbox Code Playgroud)

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

两个问题:

  • 如果禁用JavaScript,则不会工作
  • 如果错误地用户关闭了原始标签,然后在地址栏中粘贴了一些其他链接到我的网站,则用户将始终收到错误页面.为了让用户有机会恢复,我在SingleTab.htm页面中包含了"注销"链接,因此用户可以销毁他的会话cookie并开始新的会话.


Pau*_*der 5

JavaScript 中的 window.opener 属性将指向打开新窗口的窗口。但是,它不区分新窗口和新选项卡。标签不是官方 W3C 规范的一部分,因此没有对它们的直接支持。