$(窗口).unload没有按预期工作

时间:2011-05-03 18:48:22

标签: javascript chat

我正在使用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;
        }

它就像一个魅力,但是当我在另一个上下文中调用这个函数时,当用户而不是按下disconnect时只退出页面,在这个函数中

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

它不起作用。而且我确定它正在被调用,因为如果我发出警报,它会在关闭页面之前正常调用。我认为在代码完全运行之前页面正在关闭,所以我想如果我在那里放一些块直到代码完成运行它会起作用吗?

3 个答案:

答案 0 :(得分:6)

问题是$(window).unload()在关闭窗口之前没有等待任何AJAX调用(什么是正确的因为AJAX是assync )。

您需要强制AJAX同步,即等待响应。在disconnectUser功能中:

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

您可以在此处详细了解:$(window).unload wait for AJAX call to finish before leaving a webpage

答案 1 :(得分:2)

而不是卸载,前载怎么样?

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

答案 2 :(得分:1)

尝试使用同步请求。也许与其他海报建议的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;
        }