2013-02-17 43 views
0

我正在尋找一種方法以某種方式讀取/檢查,如果其他瀏覽器選項卡打開請求的標籤之前開放。的JavaScript - 讀一個單獨的標籤,以檢查它是否是開放

例如:

這是我的流量交換的網站,他們只是開mysite.com/surf.php,離開它查看用戶的一幀中提交的網站。他們只是爲了離開跑步而賺取積分。

現在讓我們說用戶A SURF頁面中運行良好,然後打開SURF PAGE B,則他有2 mysite.com/surf.php運行和盈利雙點其他人將獲得。

我希望發生的是:

用戶A SURF頁面中運行良好,然後嘗試打開SURF B頁面,將檢查是否另一個mysite.com/surf.php已經打開,如果是將第二個衝浪頁面的請求重定向到另一個頁面mysite.com/surf-error.php

因此,他們只能在任何給定時間運行1個mysite.com/surf.php。

我該如何去做這件事?

當你開始跟蹤時間有人
+0

它會更容易簡單地說「一個用戶x'指向第二個能最大增益'」,如果他們獲得了一個點的最後時間少於'y',然後不加點。 – h2ooooooo 2013-02-17 21:04:25

+0

設置會話變量。如果您已經在追蹤時間,請不要第二次跟蹤時間。 – 2013-02-17 21:04:26

+0

使用數據庫作爲存儲進行跟蹤。 – 2013-02-17 21:04:28

回答

1

瀏覽器窗口可以通過交換一些信息:

  1. 餅乾
  2. 本地存儲
  3. 與公共服務器通信

您可以使用1 )或2)存儲關於活動頁面的一些信息,並且如果其他頁面已經處於活動狀態,則拒絕讓其他頁面處於活動狀態。

但是,最可靠的方法,在執行政策像你問的是使用實際的服務器來執行它。如果用戶登錄,然後編碼服務器只允許登錄的用戶積攢積分在一個時間一個地點。

比這些選擇其他,如果要強制所有客戶端,你可能會需要一個瀏覽器插件,可以監控所有打開的瀏覽器窗口(我假設是不實際的)。您無法監視用戶從網頁中的普通JavaScript打開的多個窗口。

0

設置變量

session.trackingtime = true 

會話,當你再次檢查開始跟蹤時間,確保值被設置爲false。當您停止跟蹤時間時,將變量設置爲false。在同一個瀏覽器相同的域

+0

你好,我不太清楚你的意思。你能告訴我的例子,或者我可以如何將它納入我的網站? – CustomNet 2013-02-17 21:10:29

+0

你如何跟蹤用戶獲得硬幣?檢查以確保在您再次開始計數之前他們尚未獲得硬幣。 – 2013-02-17 21:15:23

0

我已經做了非常今天類似的東西。剛剛更新else if部分做一個重定向你的情況。

// 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); 
} 
相關問題