Выяснить, действительно ли пользователь закрыл браузер или нет - PullRequest
0 голосов
/ 24 октября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 24 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...