0

要求されたタブを開く前に、別のブラウザタブが開いているかどうかを何らかの方法で読み取って確認する方法を探しています。

例えば:

これは私のトラフィック交換サイト用です。mysite.com/surf.phpを開いて、ユーザーが送信したサイトをフレーム内に表示したままにします。彼らはそれを実行したままにするだけでポイントを獲得します。

ここで、ユーザーAがSURF PAGE Aを正常に実行していて、SURF PAGE Bを開くと、2つのmysite.com/surf.phpが実行され、他のすべての人が獲得するポイントの2倍を獲得するとします。

私がしたいのは:

ユーザーAはSURFPAGEAを正常に実行してから、SURF PAGE Bを開こうとします。これにより、別のmysite.com/surf.phpがすでに開いているかどうか、および2番目のサーフページの要求を別のmysite.com/にリダイレクトするかどうかが確認されます。 surf-error.php

したがって、一度に実行できるmysite.com/surf.phpは1つだけです。

どうすればこれを行うことができますか?

4

3 に答える 3

1

同じブラウザの同じドメインにあるブラウザウィンドウは、次の方法で情報を交換できます。

  1. クッキー
  2. ローカルストレージ
  3. 共通サーバーとの通信

1)または2)を使用して、アクティブなページに関する情報を保存し、他のページがすでにアクティブになっている場合は、他のページをアクティブにすることを拒否できます。

しかし、あなたが求めているようなポリシーを実施するための最も信頼できる方法は、実際のサーバーを使用してそれを実施することです。ユーザーがログインしている場合は、ログインしているユーザーが一度に1つのサイトのポイントのみを蓄積できるようにサーバーをコーディングします。

これらのオプション以外に、すべてのクライアント側で適用する場合は、開いているすべてのブラウザーウィンドウを監視できるブラウザープラグインが必要になる可能性があります(これは実用的ではないと思います)。Webページのプレーン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 に答える