2011-05-03 150 views
3

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

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

回答

2

而不是卸载,如何beforeunload?

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

此外,您disconnectUser方法已经设置connectedfalse,没有必要在这里做它也。

这也似乎jQuery不会办理真的beforeunload事件,这就是为什么你需要恢复到原生JS来处理这个问题:

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

+0

你说得对,我是设置连接到两次假,感谢这个! – 2011-05-03 19:33:58

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; 
     } 
6

的问题是,$(window).unload()不关窗(什么是对的,因为AJAX是assync)前等待任何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

+0

完美,正是我需要的!谢谢...... – 2011-05-03 19:30:34

+1

如果我已经完全回答你的问题,请将其标记为已接受**。如果仍有问题,请告诉我们,以便我们完成答案。 – 2011-05-04 13:56:42