Подтвердить что ты не робот

Можно ли обнаружить, открыто ли у пользователя несколько вкладок вашего сайта?

Я просто думаю о процессе регистрации всего сайта.

Пользователь отправляется на ваш сайт, подписывается, а затем вы говорите ему, что отправили ему электронное письмо, и ему необходимо проверить его адрес электронной почты. Таким образом, он нажимает Ctrl + T, всплывает новая вкладка, нажимает кнопку Gmail fav, не читает ни слова вашего долгожданного приветственного сообщения, а кликает по первой ссылке, которую он видит. Gmail открывает ваш сайт еще на одной вкладке...

Ему не нужно и не нужно открывать две вкладки для вашего сайта, он просто хочет просмотреть ту страницу, в которой вы запретили доступ, пока он не зарегистрируется.

И что нам делать? Я видел один сайт (но я забыл, что это было), который сделал действительно хорошую работу, и он фактически обновил первую вкладку, которую я открыл, без меня что-либо нажимать.

Я думаю, было бы неплохо, если бы мы могли определить, есть ли у пользователя уже открытая вкладка на ваш сайт, мы можем либо закрыть новую учетную запись автоматически, либо сказать, что он может закрыть ее, может вернуться к его другую вкладку (которую мы сейчас обновили и запустили в него).

Или, может быть, когда он получил ваше раздражающее сообщение "пожалуйста, проверьте свою электронную почту", он сразу отправился на его электронную почту, заменив ваш сайт своим письмом, зная, что письмо снова свяжет его с сайтом. В этом случае мы не хотим закрывать вкладку, но, возможно, могли бы сохранить свое местоположение раньше и снова перенаправить его туда?

В любом случае, это только прецедент... вопрос все еще стоит. Можем ли мы определить, есть ли у пользователя уже открытая вкладка на ваш сайт?


Этот вопрос не о том, как определить, когда пользователь завершил процесс регистрации. Ajax-опрос или комета могут решить эту проблему. Я специально хочу знать, есть ли у пользователя уже открытая вкладка для вашего сайта или нет.

4b9b3361

Ответ 1

Я довольно опаздываю на вечеринку здесь (более года), но я не мог не заметить, что вы пропустили невероятно простое и элегантное решение (и, вероятно, то, что использовал этот сайт).

С помощью JavaScript вы можете изменить имя окна, в котором вы сейчас открылись:

window.name = "myWindow";

Затем, когда вы отправляете письмо с подтверждением, просто делайте (при условии, что вы отправляете письмо в формате HTML):

<a href="verificationlink.php" target="myWindow">Verify</a>

Что должно привести к открытию verificationLink внутри окна, на котором был загружен ваш веб-сайт, если он уже закрыт, он откроет новую вкладку с указанным именем окна.

Ответ 2

Вы можете отправить запрос AJAX каждые X секунд с исходной вкладки, которая запрашивает сервер, если он получил запрос от электронной почты.

Вы не можете закрыть вторую вкладку автоматически, но вы могли бы спросить ее через 3X секунды, слышал ли она с первой вкладки.

Ответ 3

Вы можете остановить функциональность страницы, когда пользователь открыл другую вкладку или другое окно или даже другой браузер

$(window).blur(function(){
    // code to stop functioning or close the page  
});

Ответ 4

То, что у меня есть, - это немного другой случай использования, но он обнаруживает, доступен ли сайт на другой вкладке. В этом случае я хотел ограничить людей, использующих некоторые страницы центра обработки вызовов, только одной вкладке. Он работает хорошо и чисто клиентский.

// 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 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);
}

Ответ 5

У пользователя все еще будет сеанс на сервере. Почему бы не сохранить местоположение пользователя до регистрации, и когда они подтвердят свою регистрацию, прочитайте местоположение обратно из сеанса и перенаправите обратно на эту страницу. Магия табуляции не требуется. Это, конечно, не то, что я ожидаю от процесса регистрации.

Ответ 6

Чтобы ответить на вопрос Джона, это рабочее решение, которое использует простой JS и localStorage и обновляет DOM с подсчетом открытых в данный момент вкладок. Обратите внимание, что это решение обнаруживает количество открытых вкладок/окон для данного домена в одном браузере, но не поддерживает счет в разных браузерах.

Он использует событие хранения, чтобы синхронизировать счет во всех открытых вкладках/окнах без необходимости обновления страницы.

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title></title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="robots" content="noindex, nofollow">
<meta name="googlebot" content="noindex, nofollow">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script>
(function() {
    var stor = window.localStorage;
    window.addEventListener("load", function(e) {
        var openTabs = stor.getItem("openTabs");
        if (openTabs) {
            openTabs++;
            stor.setItem("openTabs", openTabs)
        } else {
            stor.setItem("openTabs", 1)
        }
        render();
    })
    window.addEventListener("unload", function(e) {
        e.preventDefault();
        var openTabs = stor.getItem("openTabs");
        if (openTabs) {
            openTabs--;
            stor.setItem("openTabs", openTabs)
        }
        e.returnValue = '';
    });
    window.addEventListener('storage', function(e) {
        render();
    })

    function render() {
        var openTabs = stor.getItem("openTabs");
        var tabnum = document.getElementById("tabnum");
        var dname = document.getElementById("dname");
        tabnum.textContent = openTabs;
        dname.textContent = window.location.host
    }
}());
</script>
</head>
<body>
<div style="width:100%;height:100%;text-align:center;">
    <h1 >You Have<h1>
        <h1 id="tabnum">0</h1>
    <h1>Tab(s) of <span id="dname"></span> Open</h1>
</div>
</body>
</html>

Ответ 7

Чтобы добавить к другим ответам: Вы также можете использовать localStorage. У вас есть запись типа openTabs. Когда ваша страница будет открыта, увеличьте это число. Когда пользователь покидает страницу, уменьшите ее.

Ответ 8

Можно отслеживать количество открытых вкладок вашего сайта, сохраняя данные в localstorage каждой вкладки и считая их одинаково. Я создал github-репозиторий, который может отслеживать количество вкладок вашего сайта, которые есть у пользователя. открыт.

Чтобы использовать его, включите tab-counter.js на своей странице, и он начнет отслеживать количество открытых вкладок.

console.log(tabCount.tabsCount());