2011-05-03 164 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