2010-10-27 66 views
27

我只是想着整个网站的注册过程。可能检测用户是否有多个选项卡打开您的站点?

用户前往您的网站注册,然后您告诉他您已经给他发送了一封电子邮件,他需要验证他的电子邮件地址。所以他点击Ctrl + T,弹出打开一个新标签,点击他的Gmail收藏按钮,没有读你长篇的欢迎邮件的单词,但点击他看到的第一个链接。 Gmail在另一个标签中打开您的网站...

他并不需要也不希望为您的网站打开两个选项卡,他只是想要查看您禁止他访问的那个网页,直到他注册为止。

那么我们该怎么做?我看到一个网站(但我忘记它是什么)做得非常好,并且实际上刷新了我打开的第一个标签,而不必按任何东西。

我在想,如果我们能够检测到用户是否已经在您的网站上打开了一个选项卡,我们可以自动关闭新的验证选项卡,或者告诉他他可以关闭它可以返回到他的其他选项卡(我们现在刷新并记录他)。或者,也许当他遇到你讨厌的“请检查你的电子邮件”的消息时,他直接去了他的电子邮件,用他的电子邮件替换你的网站,并且知道电子邮件会将他再次链接到该网站。在这种情况下,我们不想关闭标签,但也许可以从之前保存自己的位置,并将其重定向到那里呢?

无论如何,这只是用例...问题依然存在。 我们可以检测用户是否已经打开了网站的标签页?


这个问题有关如何检测用户已完成注册过程。 Ajax轮询或彗星可以解决这个问题。我特别想知道用户是否已经有一个标签可以打开您的网站。

+0

我不太满意写出完整的答案 - 但基本上,您需要使用cookie,本地存储或服务器端来进行跟踪 - 实际上,任何形式的存储单个窗口之外的数据。 – 2010-10-27 23:52:00

+1

@Ed:我在乎。我注意到小事情。那个网站给我留下了很好的印象! – mpen 2010-10-28 00:02:24

+0

你的目标浏览器是什么?你能用localStorage吗? – Warty 2010-10-28 01:41:23

回答

33

我对这里的派对相当晚了(一年多),但我不禁注意到你错过了一个非常简单和优雅的解决方案(可能是你看到过的那个网站)。

使用JavaScript你可以改变你目前有打开过窗口的名称:

window.name = "myWindow"; 

然后,当你发送确认邮件中简单地做(假设你发送的HTML电子邮件):

<a href="verificationlink.php" target="myWindow">Verify</a> 

这应该会导致verificationLink在您的网站已经加载到的窗口内打开,如果它已经关闭,它会打开一个新窗口,并指定窗口名称。

+2

如果页面在两个不同的浏览器中打开,则不起作用。但是当然这个问题没有提到,所以我在说什么? :D – 2013-09-07 08:16:36

+3

这并没有真正回答这个问题:“我们可以检测用户是否已经有一个标签到您的网站打开?”另一个例子可能是,如果你的网站上有两个窗口打开,你要警告用户。 – bvs 2014-12-17 16:28:00

6

您可以每隔X秒发送一个AJAX请求,该标签询问服务器是否收到来自电子邮件的请求。

您不能自动关闭第二个选项卡,但是您可以在第一个选项卡听到3X秒之后询问服务器。

2

用户仍然会在服务器上进行会话。为什么不在注册之前存储用户的位置,以及何时确认注册,请将位置从会话中取出并重定向回该页面。不需要标签魔法。这当然不是我期望的注册过程。

+0

然后你仍然有第一个标签。 – SLaks 2010-10-27 23:55:18

+0

是的。这就是注册过程中发生的情况。我们习惯了。 – spender 2010-10-27 23:56:22

+0

然后,两个标签都打开相同的页面...我们不需要两个完全相同的页面。我在问我如何关闭其中一个。 – mpen 2010-10-27 23:59:46

6

当用户打开其他标签页或窗口,甚至另一个浏览器您可以停止页面功能

$(window).blur(function(){ 
    // code to stop functioning or close the page 
}); 
3

我这里有一点点不同的使用情况下给你,但它检测,如果该网站是为在另一个标签中访问。在这种情况下,我想限制使用一些呼叫中心页面的用户只能使用一个选项卡。它运行良好,纯粹是客户端。

// helper function to set cookies 
function setCookie(cname, cvalue, seconds) { 
    var d = new Date(); 
    d.setTime(d.getTime() + (seconds * 1000)); 
    var expires = "expires="+ d.toUTCString(); 
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; 
} 

// helper function to get a cookie 
function getCookie(cname) { 
    var name = cname + "="; 
    var decodedCookie = decodeURIComponent(document.cookie); 
    var ca = decodedCookie.split(';'); 
    for(var i = 0; i < ca.length; i++) { 
     var c = ca[i]; 
     while (c.charAt(0) == ' ') { 
      c = c.substring(1); 
     } 
     if (c.indexOf(name) == 0) { 
      return c.substring(name.length, c.length); 
     } 
    } 
    return ""; 
} 

// Do not allow multiple call center tabs 
if (~window.location.hash.indexOf('#admin/callcenter')) { 
    $(window).on('beforeunload onbeforeunload', function(){ 
     document.cookie = 'ic_window_id=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; 
    }); 

    function validateCallCenterTab() { 
     var win_id_cookie_duration = 10; // in seconds 

     if (!window.name) { 
      window.name = Math.random().toString(); 
     } 

     if (!getCookie('ic_window_id') || window.name === getCookie('ic_window_id')) { 
      // This means they are using just one tab. Set/clobber the cookie to prolong the tab's validity. 
      setCookie('ic_window_id', window.name, win_id_cookie_duration); 
     } else if (getCookie('ic_window_id') !== window.name) { 
      // this means another browser tab is open, alert them to close the tabs until there is only one remaining 
      var message = 'You cannot have this website open in multiple tabs. ' + 
       'Please close them until there is only one remaining. Thanks!'; 
      $('html').html(message); 
      clearInterval(callCenterInterval); 
      throw 'Multiple call center tabs error. Program terminating.'; 
     } 
    } 

    callCenterInterval = setInterval(validateCallCenterTab, 3000); 
} 
+0

你能总结一下你在做什么吗?看起来你给每个窗口/标签一个随机的名字并将其保存到一个cookie中。然后你每10秒钟检查一次cookie,如果不匹配,你会提醒他们?当他们回退到1个选项卡时,是否会重置名称,以便第一个选项卡处于良好状态? – mpen 2017-04-29 19:40:52

1

要添加到其他答案: 您也可以使用localStorage。有一个类似'openedTabs'的条目。当你的页面被打开时,增加这个数字。当用户离开页面时,减少它。

相关问题