0

我正在寻找一种在打开请求的选项卡之前以某种方式读取/检查另一个浏览器选项卡是否打开的方法。

例如:

这是我的流量交换网站,他们只是打开 mysite.com/surf.php 并让它在一个框架中查看用户提交的网站。他们只是因为离开那场比赛而获得积分。

现在假设用户 A 的 SURF PAGE A 运行良好,然后打开 SURF PAGE B 然后他有 2 mysite.com/surf.php 正在运行并获得其他人将获得的双倍积分。

我想要发生的是:

用户 A 的 SURF PAGE A 运行良好,然后尝试打开 SURF PAGE B,这将检查另一个 mysite.com/surf.php 是否已打开,以及是否将对第二个 surf 页面的请求重定向到另一个 mysite.com/冲浪错误.php

因此,他们在任何给定时间只能运行 1 个 mysite.com/surf.php。

我该怎么做呢?

4

3 回答 3

1

同一浏览器中同一域上的浏览器窗口可以通过以下方式交换一些信息:

  1. 饼干
  2. 本地存储
  3. 与公共服务器通信

您可以使用 1) 或 2) 来存储有关活动页面的一些信息,并且如果其他页面已经处于活动状态,则拒绝让其他页面处于活动状态。

但是,执行您所询问的策略的最可靠方法是使用实​​际的服务器来执行它。如果用户有登录名,则对服务器进行编码以仅允许登录用户一次为一个站点累积积分。

除了这些选项之外,如果您想在客户端强制执行它,您可能需要一个可以监视所有打开的浏览器窗口的浏览器插件(我认为这不切实际)。您不能从网页中的纯 javascript 监视用户打开的多个窗口。

于 2013-02-17T21:19:55.873 回答
0

当您开始跟踪某人的时间时设置会话变量

session.trackingtime = true

当您再次检查以开始跟踪时间时,请确保该值设置为false. 当您停止跟踪时间时,将变量设置为false

于 2013-02-17T21:07:33.850 回答
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);
}
于 2017-04-29T04:08:45.903 回答