Задать вопрос
@Paul14

Как отправить запрос на сервер при закрытии вкладки?

Хочу отправить запрос на сервер при закрытии вкладки, что пользователь не в сети. Параметр online = 0.
Стек react, php, mysql. Доступа к серверу нет, хостинг обычный.

useEffect(() => {
    
        const handleBeforeUnload = (event) => {
                QDB.edit(manager.id, { online: 0, logout_date: D_TimeNow(), navigator: navigator.userAgent }, 'users');
        };
    
        window.addEventListener('beforeunload', handleBeforeUnload);
        return () => { window.removeEventListener('beforeunload', handleBeforeUnload); };

    }, []);


Все ок, однако браузер не различает перезагрузку страницы, закрытие всего браузера, закрытие конкретной вкладки - как разные действия. Мне нужно, чтобы только при закрытие владки отправлялся запрос к БД.

Как проигнорировать перезагрузку страницы?

В инетах пишут про sessionStorage. Не получилось.
const sessionSecondLoad = sessionStorage.getItem('sessionSecondLoad');
if (!sessionSecondLoad)      sessionStorage.setItem('sessionSecondLoad', 'true');
// Функция размонтирования компонента
 const handleBeforeUnload = (event) => {
sessionStorage.getItem('sessionSecondLoad'); // будет равна актуальному значению true - то есть в момент закрытия не будет удалена, поэтому не могу понять, что это именно закрытие вкладки, а не перезагрузка
}
  • Вопрос задан
  • 3761 просмотр
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@fuliozor
Web and Android developer
Можно попробовать воспользоваться вот этим апи https://developer.mozilla.org/ru/docs/Web/API/Navi... для того чтоб слать запрос при закрытии вкладки но это же при будет срабатывать и при перезагрузке страницы.
Но по опыту могу сказать что у вас немного неправильный подход. Ваше решение если и будет работать то только в "идеальных" случаях, но очень часто будет работать не так как вы ожидаете, например пропал интернет, выключился компьютер, в телефоне села батарейка, пользователь закрыл браузер выбросив его из недавних и т.д. в этих всех случаях пользователь у вас зависнет в статусе онлайн. Чтоб справится с этими проблемами шлите, например, каждые 10 секунд (интервал подберите экспериментальным путем или исходя из того какую нагрузку может держать ваш хостинг) запрос на ваш бек, таким образом будете подтверждать что пользователь онлайн, если в течении 25 секунд (желательно чтоб время было >2х чем интервал, чтоб исключить ситуации когда один из запросов не доехал из за кратковременных проблем в сети) не было запросов от клиента значит он офлайн.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
IvanSCM
@IvanSCM
Заведите константу а-ля какое время считать пользователя активным, например минута.
При каждом запросе записывайте время этого запроса (действия пользователя).
Далее простая функция пусть вычисляет онлайн пользователь или нет(прошла минута с последнего запроса этого пользователя или нет).

Данное решение используется во многих движках сайтов и форумов.
Ответ написан
grantur5707
@grantur5707
Full Stack Web Developer
Можно установить флаг в sessionStorage для условия перезагрузки страницы:

useEffect(() => {
  sessionStorage.setItem('isReloading', 'true');

  const handleBeforeUnload = (event) => {
    const isReloading = sessionStorage.getItem('isReloading');
    if (isReloading === 'false') {
      QDB.edit(manager.id, { online: 0, logout_date: D_TimeNow(), navigator: navigator.userAgent }, 'users');
    }
  };

  const handleUnload = () => {
    sessionStorage.setItem('isReloading', 'false');
  };

  window.addEventListener('beforeunload', handleBeforeUnload);
  window.addEventListener('unload', handleUnload);

  return () => {
    window.removeEventListener('beforeunload', handleBeforeUnload);
    window.removeEventListener('unload', handleUnload);
  };
}, []);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 дек. 2024, в 13:01
50000 руб./за проект
22 дек. 2024, в 10:44
15000 руб./за проект
22 дек. 2024, в 10:12
10000 руб./за проект