Как определить разницу между обновлением страницы и закрытием страницы - PullRequest
4 голосов
/ 18 мая 2009

У меня есть игра для веб-приложения, и в то время как в игре я хочу, чтобы она была, поэтому, если пользователь закрывает страницу или браузер, он автоматически выходит из системы. Я попытался использовать событие onbeforeunload, прикрепленное к окну:

window.onbeforeunload = function() {
    // perform logout functions here
}

Проблема в том, что это также сработает, если пользователь обновит страницу. Могу ли я определить, полностью ли пользователь закрывает всю страницу или просто обновляет ее?

Ответы [ 4 ]

8 голосов
/ 18 мая 2009

Различий не обнаружено. Чтобы автоматически выйти из системы, вы должны установить срок действия файла cookie, в котором хранятся данные для входа или сеанса. Таким образом, если вы установите его на 1 час, пользователь по существу выйдет из системы по истечении этого времени, поскольку cookie будет уничтожен. Если вы хотите отложить этот автоматический выход из системы, когда они все еще взаимодействуют с сайтом, вы можете сбрасывать срок действия файла cookie каждый раз, когда они выполняют какое-либо действие (щелчок по ссылке, активация вызова AJAX и т. Д.). Это будет означать, что они выйдут из системы через 1 час бездействия, а не через 1 час после входа, что больше похоже на то, что вы хотите.

Если вы установите срок действия файла cookie на 0, то срок его действия истечет после окончания сеанса. Это обычно происходит, когда пользователь полностью закрывает свой браузер. Это еще один вариант.

2 голосов
/ 18 мая 2009

Пусть событие onunload отправит запрос на сервер, что приведет к истечению времени сеанса через n секунд (где n - максимальное время выполнения запроса на перезагрузку страницы, поэтому, возможно, 10). Затем сделайте скрипт для проверки сайта, чтобы увидеть, запланировано ли это событие, и если это так, отмените его. Это даст вам поведение, которое вы, кажется, хотите.

Но да, я бы рекомендовал просто закончить сеанс.

2 голосов
/ 18 мая 2009

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

Возможный обходной путь - использование Ajax-скрипта «Звонок домой»: если он какое-то время молчит, пользователь просто покинул сайт (закрытая страница или браузер).

0 голосов
/ 18 мая 2009

Если я не ошибаюсь, в Javascript должна быть функция с именем что-то вроде onWindowClose, возможно, попробуйте найти ее?

Относительно решений PHP, я не уверен, есть ли они, но я предлагаю вам взглянуть на Обработка соединений PHP , в частности на функции connection_aborted () и register_shutdown_function ().

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