【问题标题】:$(window).unload not working as expected$(window).unload 未按预期工作
【发布时间】:2011-08-17 23:12:16
【问题描述】:

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

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

【问题讨论】:

    标签: javascript chat


    【解决方案1】:

    而不是卸载,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

    【讨论】:

    • 你说得对,我将连接设置为 false 两次,谢谢!
    【解决方案2】:

    尝试使用同步请求。也许与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;
            }
    

    【讨论】:

      【解决方案3】:

      问题在于$(window).unload() 在关闭窗口之前不会等待任何 AJAX 调用(这是正确的因为 AJAX 是异步的)。

      您需要强制 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

      【讨论】:

      • 如果我已经完全回答了您的问题,请将其标记为已接受。如果仍有问题,请告诉我们,以便我们完成答案。
      猜你喜欢
      • 2021-06-04
      • 2022-01-24
      • 2015-05-11
      • 2020-05-15
      • 2014-10-31
      • 2018-02-12
      • 2014-01-20
      • 2015-01-13
      • 2013-08-01
      相关资源
      最近更新 更多