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

时间:2009-05-11 21:00:46

标签: javascript tabs

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

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

7 个答案:

答案 0 :(得分:33)

你可以这样做:

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,但我不知道它们可能是什么。

答案 1 :(得分:11)

除了JavaScript中的history.length,您还可以读/写窗口的名称。

因此,如果你检查它是否有一个名称onload ...它应该在第一次加载时是空白的...如果你然后将其设置为“foo”...在每个后续在该窗口中加载... window.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的名称(非常ODD错误,没有预期的修复)

答案 2 :(得分: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>

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

两个问题:

    如果JavaScript禁用
  • ,则
  • 不会出现问题
  • 如果用户错误地关闭了原始标签,然后在地址栏中粘贴了一些其他链接到我的网站,则用户将始终收到错误页面。为了让用户有机会恢复,我已经包含了#34;退出&#34;在SingleTab.htm页面中链接,这样用户就可以销毁他的会话cookie并开始新的会话。

答案 3 :(得分:3)

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

答案 4 :(得分:2)

简短的回答是,不。答案很长,如果你正在从你的页面到服务器端方法进行ajaxy调用,那么可以保持打开窗口(在很短的时间内调用)。这将是一个草率,不可靠的混乱,你无法区分新窗口或标签。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这是客户行为,所以我认为你可以用javascript做一些事情,比如查看浏览器历史记录,但是新标签页和新窗口之间的含糊不清。

除此之外,并非所有浏览器都有标签,并且并非所有浏览器都具有与标签相同的含义(在某些过程中是不同的过程,在某些其他过程中它们不是)。

但是,你为什么要检查?如果您的应用程序是在新标签中执行,那真的很重要吗?我不这么认为......