Выяснить, действительно ли пользователь закрыл браузер или нет

1

Я работаю над веб-приложением, в котором пользователи редактируют общие ресурсы. Вы можете думать о статьях Википедии или о переполнении стека в качестве рабочих примеров доступных для редактирования общих ресурсов.

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

Проблема в том, что когда пользователь закрывает браузер, "покинуть сайт?" появится диалоговое окно, и пользователь может выбрать, оставить или остаться. Это проблема, потому что, начиная с определенной версии Google Chrome, я не могу сказать, решил ли пользователь остаться или уйти, и поэтому я не могу знать, действительно ли я должен разблокировать ресурс.

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

Есть ли способ различать случай, когда пользователь выбирает отпуск, и случай, в котором он решил остаться? Альтернативно, существует ли лучший способ реализовать механизм блокировки, так что ресурс разблокируется автоматически, когда пользователь закрывает браузер?

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

1 ответ

0

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

window.onunload = function () {
    navigator.sendBeacon('/api/unlockResource/12345');
};

К сожалению, мобильный Safari еще не поддерживает маяки, и только последние версии Edge и настольного Safari, поэтому вам может потребоваться попробовать XMLHttpRequest найти обходной путь, если вам нужна эта дополнительная поддержка. Например, вы можете использовать запрос fetch() с keepalive: true, но я не могу подтвердить, что Mobile Safari поддерживает его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню