javascript - 阅读单独的标签以检查它是否已打开

时间:2013-02-17 21:02:45

标签: javascript jquery

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

例如:

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

现在让我们假设用户A有SURF页面A正常运行然后打开SURF页面B然后他有2个mysite.com/surf.php正在运行并获得双倍其他人将获得的积分。

我想要发生的是:

USER A有SURF PAGE A正常运行,然后尝试打开SURF PAGE B,检查是否已经打开另一个mysite.com/surf.php,是否要将第二个冲浪页面的请求重定向到另一个mysite的.com /冲浪error.php

所以他们在任何时候都只能运行1个mysite.com/surf.php。

我将如何做到这一点?

3 个答案:

答案 0 :(得分:1)

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

  1. 缓存
  2. 本地存储
  3. 与公共服务器通信
  4. 您可以使用1)或2)存储有关活动页面的一些信息,如果其中一个页面已经处于活动状态,则拒绝让其他页面处于活动状态。

    但是,执行像您所要求的策略的最可靠方法是使用实​​际服务器来强制执行它。如果用户具有登录名,则将服务器编码为仅允许登录用户一次累积一个站点的点数。

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

答案 1 :(得分:0)

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

session.trackingtime = true

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

答案 2 :(得分: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);
}