$ (window) .unload не работает должным образом - PullRequest
3 голосов
/ 03 мая 2011

Я делаю небольшое приложение для чата с PHP + MySQL + JavaScript, я написал функцию disonnectUser (), которая вызывается, когда пользователь нажимает кнопку отключения. Вот оно:

function disconnectUser(){
            $.post('web/WEB-INF/classes/handleChatUser.php',{ action: 'disconnect',nick: localNickname});           
            $('#chat').stop(true,true).fadeOut(2000,function(){
                nicknameDialog();
            });

            $('#messageInput').val(null);
            $('#clientList').html(null);
            $('#chatScreen').html(null);
            clearInterval(refreshIntervalId);
            clearInterval(refreshIntervalId2);
            connected = false;
        }

И это работает как талисман, но когда я вызываю эту функцию в другом контексте, когда пользователь вместо нажатия кнопки разъединения просто выходит из страницы, в этой функции

$(window).unload(function() {
                if(connected){
                disconnectUser();
                connected = false;
                }
            });

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

Ответы [ 3 ]

6 голосов
/ 03 мая 2011

Проблема в том, что $(window).unload() не ждет ни одного вызова AJAX перед закрытием окна (что правильно , потому что AJAX является assync ).

Вам нужно принудительно синхронизировать AJAX, то есть дождаться ответа. Внутри вашей disconnectUser функции:

$.ajax({
    type: 'POST',
    async: false, // This is the guy.
    url: '/blablabla'
});

Подробнее об этом можно прочитать здесь: $ (окно) .unload ждать завершения вызова AJAX, прежде чем покинуть веб-страницу

2 голосов
/ 03 мая 2011

Вместо выгрузки, как насчет beforeunload?

window.onbeforeunload = function() {
    if(connected){
        disconnectUser();
        connected = false;
    }
};

Кроме того, ваш метод disconnectUser уже устанавливает connected в false, здесь не нужно делать это также.

Также кажется, что jQuery на самом деле не обрабатывает событие beforeunload, поэтому вам нужно вернуться к нативному JS для обработки этого:

http://groups.google.com/group/jquery-en/browse_thread/thread/4e5b25fa1ff5e5ee?pli=1

1 голос
/ 03 мая 2011

Попробуйте использовать синхронный запрос.Возможно, в сочетании с onbeforunload, как предложил другой постер.Если это не сработает, я полагаю, вам не повезло.Синхронный запрос блокирует браузер во время его выполнения, поэтому вы можете использовать его только для функции выгрузки, при условии, что метод даже работает.

function disconnectUser(){
            jQuery.ajax({
                url: 'web/WEB-INF/classes/handleChatUser.php',
                data: { action: 'disconnect',nick: localNickname},
                type: 'POST',
                async: false
            });

            $('#chat').stop(true,true).fadeOut(2000,function(){
                nicknameDialog();
            });

            $('#messageInput').val(null);
            $('#clientList').html(null);
            $('#chatScreen').html(null);
            clearInterval(refreshIntervalId);
            clearInterval(refreshIntervalId2);
            connected = false;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...