Определите, открыл ли браузер уже URL-адрес

Мы используем внутреннюю систему (с браузером по умолчанию FF)

Нам нужно избегать того, чтобы пользователь открывал один и тот же URL-адрес на разных вкладках. Поскольку вкладки используют один и тот же сеанс PHP, мы получаем беспорядок. Итак, на самом деле я ищу способ программно проверить, открыт ли определенный URL-адрес на одной из открытых вкладок. На стороне клиента (JS) или на стороне сервера (PHP).

Теперь мы используем расширение FF «Duplicate Tabs Closer», которое помогает. Но я бы предпочел сохранить полный контроль (предупредить, выбрать, для какого URL он работает).

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
364
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете записать файл cookie после загрузки страницы на первой вкладке, проверить его на стороне сервера и показать предупреждение пользователя вместо фактического содержимого страницы, если этот файл cookie установлен и открыта вторая вкладка. Чтобы обработать случай, когда пользователь закрывает единственную открытую вкладку, вы можете удалить этот файл cookie в обработчике onbeforeunload.

Спасибо за ваше предложение, я пробую перед загрузкой w3schools.com/jsref/tryit.asp?filename=tryjsref_onbeforeunlo‌ объявление, но он не работает в моем FF (он работает с Chrome)

Alexander P 08.09.2018 15:20

Попробуйте установить обработчик onbeforeunload на объект window, а не на body. Вот пример jsfiddle.net/urogqmkp/3. PS: w3schools - не лучший источник знаний. Лучше использовать developer.mozilla.org или devdocs.io.

Oleksandr Kovpashko 08.09.2018 15:28

Спасибо, уже тестировал. (объект окна) :) С довольно странным результатом в FF. Я стреляю по щелчку и при перезагрузке. Но не близко. Но если я открываю консоль разработчика (F12) перед закрытием вкладки, она также запускается при закрытии.

Alexander P 08.09.2018 15:53

Вы правы. Я не часто использовал обработчик onbeforeunload в своей практике и, похоже, я пропустил, что firefox удалил возможность отображать подтверждающее сообщение от этого обработчика. Но обработчик работает и вызывается перед закрытием вкладки. Вы можете легко проверить это в следующем примере jsfiddle.net/urogqmkp/17. Откройте пример, посмотрите в консоли, закройте вкладку, снова откройте и снова посмотрите в консоль.

Oleksandr Kovpashko 08.09.2018 16:19

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

Oleksandr Kovpashko 08.09.2018 16:32

Отработав ответ Александра, вы можете сохранить карту количества открытий URL-адреса в файле cookie. Когда страница открыта, увеличьте число или установите его на 0. Когда страница закрыта, уменьшите ее или удалите.

function incrementTabsOpen() {
    let tabsOpen = readObjCookie('tabsOpen') || {};
    if (tabsOpen[window.location.href]) tabsOpen[window.location.href]++;
    else tabsOpen[window.location.href] = 0;
    writeObjCookie('tabsOpen', tabsOpen);
}
function decrementTabsOpen() {
    let tabsOpen = readObjCookie('tabsOpen') || {};
    if (tabsOpen[window.location.href]) tabsOpen[window.location.href]--;
    if (tabsOpen[window.location.href] === 0) delete tabsOpen[window.location.href];
    writeObjCookie('tabsOpen', tabsOpen);
}

// https://stackoverflow.com/a/11344672/3783155
function readObjCookie(name) {
    let result = document.cookie.match(new RegExp(name + '=([^;]+)'));
    if (result) result = JSON.parse(result[1]);
    return result;
}
function writeObjCookie(name, value) {
    document.cookie = name + '=' + JSON.stringify(value);
}

а также

window.addEventListener('load', function() {
    incrementTabsOpen();
};
window.addEventListener('unload', function() {
    decrementTabsOpen();
};

Другие вопросы по теме