代码之家  ›  专栏  ›  技术社区  ›  swampsjohn

是否可以检测用户是否在新选项卡中打开了链接?

  •  30
  • swampsjohn  · 技术社区  · 15 年前

    如果用户在您的网站上,并在新选项卡中打开另一个链接(也指向您的网站),是否可以将其与正常单击链接的用户区分开来?这可以在javascript中,在服务器上,无论什么。

    我猜答案是你不能这样做,但我想再核实一下。

    7 回复  |  直到 12 年前
        1
  •  34
  •   RichieHindle    15 年前

    你可以这样做:

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

        2
  •  11
  •   scunliffe    15 年前

    除了在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>
    

    Caveats:

    • 如果页面最初加载到已经有名称的窗口/框架中…事情会变得很奇怪
    • 如果您的页面有(命名的)iframe,并且您有任何指向这些iframe的链接,那么在IE7/8中有一个bug,当用户在一个新的选项卡/窗口中打开这些链接时,新的选项卡/窗口将“继承”最初目标的iframe的名称(非常奇怪的bug,从来没有预期的修复方法)。
        3
  •  6
  •   JustAMartin    12 年前

    这是我在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并开始新的会话。
        4
  •  3
  •   Paul Alexander    15 年前

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

        5
  •  2
  •   Tracker1    15 年前

    简短的回答是,不。长的回答是,如果您正在从页面到服务器端方法进行一个半封闭的调用,那么可以保持窗口的ttrack打开(在短时间内调用)。这将是一个马虎的,不可靠的混乱,你不能区分一个新窗口或一个标签的问题。

        6
  •  0
  •   Burke    15 年前

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

        7
  •  0
  •   eKek0    15 年前

    这是客户端行为,所以我认为您可以使用JavaScript做一些事情,比如检查浏览器历史记录,但是新选项卡和新窗口之间的关系不明确。

    除此之外,并不是所有的浏览器都有标签,也不是所有的浏览器都有相同的标签含义(有些浏览器是不同的流程,有些浏览器则没有)。

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