Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript-读取一个单独的选项卡,检查它是否';它开着_Javascript_Jquery - Fatal编程技术网

javascript-读取一个单独的选项卡,检查它是否';它开着

javascript-读取一个单独的选项卡,检查它是否';它开着,javascript,jquery,Javascript,Jquery,我正在寻找一种方法,在打开请求的选项卡之前,以某种方式读取/检查另一个浏览器选项卡是否已打开 例如: 这是我的流量交换网站,他们只是打开mysite.com/surf.php,让它在一个框架中查看用户提交的网站。他们只需离开跑步场就可以获得积分 现在让我们假设用户A的冲浪页面A运行良好,然后打开冲浪页面B,然后他有2个mysite.com/SURF.php运行,并获得其他人将获得的两倍积分 我希望发生的是: 用户A的冲浪页面A运行正常,然后尝试打开冲浪页面B,该页面将检查另一个mysite.co

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

例如:

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

现在让我们假设用户A的冲浪页面A运行良好,然后打开冲浪页面B,然后他有2个mysite.com/SURF.php运行,并获得其他人将获得的两倍积分

我希望发生的是:

用户A的冲浪页面A运行正常,然后尝试打开冲浪页面B,该页面将检查另一个mysite.com/SURF.php是否已打开,以及是否将第二个冲浪页面的请求重定向到另一个mysite.com/SURF-error.php

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


我该怎么做呢?

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

session.trackingtime = true

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

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

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

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


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

    我今天也做了类似的事情。只要更新
    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);
    }
    
    //用于设置Cookie的帮助函数
    函数setCookie(cname、cvalue、seconds){
    var d=新日期();
    d、 设置时间(d.getTime()+(秒*1000));
    var expires=“expires=“+d.toutString();
    document.cookie=cname+“=”+cvalue+”;“+expires+”;path=/”;
    }
    //获取cookie的助手函数
    函数getCookie(cname){
    变量名称=cname+“=”;
    var decodedCookie=decodeURIComponent(document.cookie);
    var ca=decodedCookie.split(“;”);
    对于(变量i=0;i
    简单地说“一个用户每秒可以获得最大
    x
    点数”会更容易,如果他们最后一次获得点数小于
    y
    ,则不要添加点数。设置会话变量。如果你已经在跟踪时间,不要再跟踪时间了。使用数据库作为存储来跟踪时间。我不能限制用户x点,因为不同的网站赚取的硬币数量不同。还有,我该如何设置会话变量或使用数据库作为存储来跟踪它呢?没有什么可以阻止某人在不同的浏览器中打开surf.php。尽管您好,我不太清楚您的意思。你能给我举个例子吗?或者我怎样才能把这些融入到我的网站中?你如何追踪用户获得的硬币?在你重新开始计数之前,检查以确保他们没有获得硬币。