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);