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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете записать файл cookie после загрузки страницы на первой вкладке, проверить его на стороне сервера и показать предупреждение пользователя вместо фактического содержимого страницы, если этот файл cookie установлен и открыта вторая вкладка. Чтобы обработать случай, когда пользователь закрывает единственную открытую вкладку, вы можете удалить этот файл cookie в обработчике onbeforeunload.
Попробуйте установить обработчик onbeforeunload на объект window, а не на body. Вот пример jsfiddle.net/urogqmkp/3. PS: w3schools - не лучший источник знаний. Лучше использовать developer.mozilla.org или devdocs.io.
Спасибо, уже тестировал. (объект окна) :) С довольно странным результатом в FF. Я стреляю по щелчку и при перезагрузке. Но не близко. Но если я открываю консоль разработчика (F12) перед закрытием вкладки, она также запускается при закрытии.
Вы правы. Я не часто использовал обработчик onbeforeunload в своей практике и, похоже, я пропустил, что firefox удалил возможность отображать подтверждающее сообщение от этого обработчика. Но обработчик работает и вызывается перед закрытием вкладки. Вы можете легко проверить это в следующем примере jsfiddle.net/urogqmkp/17. Откройте пример, посмотрите в консоли, закройте вкладку, снова откройте и снова посмотрите в консоль.
Я наконец-то понял. Согласно этот ответ, Firefox проверяет, взаимодействует ли пользователь со страницей, и показывает всплывающее окно только в случае событий клавиатуры или мыши. Поэтому, если вы щелкните где-нибудь в разделе результатов моего первого примера в Firefox и попытаетесь закрыть вкладку, вы должны увидеть всплывающее окно.
Отработав ответ Александра, вы можете сохранить карту количества открытий 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();
};
Спасибо за ваше предложение, я пробую перед загрузкой w3schools.com/jsref/tryit.asp?filename=tryjsref_onbeforeunlo объявление, но он не работает в моем FF (он работает с Chrome)