2010-10-27 81 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'的條目。當你的頁面被打開時,增加這個數字。當用戶離開頁面時,減少它。

相關問題