AJAX и пользователь, покидающий страницу
Я работаю в чате, и я пытаюсь выяснить, как я могу обнаружить, что пользователь покинул страницу или нет. Почти все обрабатывается базой данных, чтобы избежать переполнения интерфейса.
То, что я пытаюсь сделать, - это когда страница оставлена по какой-либо причине (окно закрыто, переходит на другую страницу, щелкает ссылку и т.д.), вызов ajax будет запущен до того, как пользователь уйдет, чтобы я мог обновить базы данных.
Вот что я пробовал:
$(window).unload(function(){
$.post("script.php",{key_leave:"289583002"});
});
По какой-то нечетной причине это не сработает, и я проверил php-код, и он отлично работает. Любые предложения?
Ответы
Ответ 1
Попробуйте следующее:
$(window).unload(function(){
$.ajax({
type: 'POST',
url: 'script.php',
async:false,
data: {key_leave:"289583002"}
});
});
Обратите внимание на async:false
, таким образом браузер ждет завершения запроса.
Использование $.post
является асинхронным, поэтому запрос может быть недостаточно быстрым, прежде чем браузер перестанет выполнять script.
Ответ 2
Это не правильный способ сделать это... Предположим, что ОС просто зависает или что-то происходит в процессе браузеров, тогда это событие не будет запущено. И вы никогда не узнаете, когда пользователь ушел, показывая его/ее онлайн после того, как он/она отключились. Вместо этого вы можете сделать это.
- Попробуйте подключить сокет, чтобы вы могли узнать, что пользователь отключен, когда разъём отключен.
- Вы можете отправить запрос на сервер (скажем, через каждые 1 секунду), чтобы вы знали, что пользователь все еще подключен. Если вы не получили запрос - даже после 2 секунд - отключите пользователя.
Ответ 3
Попробуйте добавить всплывающее окно (подсказка ( "уходит так рано?" )) после $.post. Это может сработать. Это может быть плохой пользовательский интерфейс.:)
Ответ 4
Это связано с ответом выше. fooobar.com/info/479521/...
Это будет выполнять вызов ajax каждые 1 сек. (1000)
function callEveryOneSec() {
$jx.ajax({}); // your ajax call
}
setInterval(callEveryOneSec, 1000);