2012-04-22 71 views
11

我正在進行聊天,我試圖弄清楚如何檢測用戶是否已離開頁面。幾乎所有的事情都由數據庫來處理,以避免前端混亂。AJAX和用戶離開頁面

所以我想要做的是一旦頁面因任何原因(窗口關閉,轉到另一個頁面,單擊鏈接等)留下一個ajax調用將在一個人離開之前被解僱,所以我可以更新數據庫。

這是我已經試過:

$(window).unload(function(){ 
     $.post("script.php",{key_leave:"289583002"}); 
}); 

對於一些奇怪的原因,它不會工作,我已經檢查了PHP代碼,並能正常工作。有什麼建議麼?

+0

的可能的複製[JavaScript中,瀏覽器,窗口關閉 - 發送AJAX請求或運行在窗口關閉的腳本(http://stackoverflow.com/questions/6162188/javascript-browsers-window -close-send-an-ajax-request-or-run-a-script-on-win) – 2017-01-12 09:55:17

回答

31

試試這個:

$(window).unload(function(){ 
    $.ajax({ 
     type: 'POST', 
     url: 'script.php', 
     async:false, 
     data: {key_leave:"289583002"} 
    }); 
}); 

注意async:false,這樣瀏覽器等待請求的完成。

使用$.post是異步的,所以在瀏覽器停止執行腳本之前,請求可能不夠快。

+0

令人敬畏的生病讓它一去! – Majo0od 2012-04-22 23:03:39

+0

我的天啊!非常感謝,今天學到了一些新東西:-) – Majo0od 2012-04-22 23:05:10

+0

不客氣:) – stewe 2012-04-22 23:39:27

1

嘗試在$ .post後添加彈出窗口(提示(「離開這麼早?」))。它可能工作。這可能是不好的用戶體驗。 :)

+0

沒有工作.... – Majo0od 2012-04-22 22:17:02

+0

我懷疑它會與任何變化一起工作,許多瀏覽器在瀏覽器時有不同的策略關閉或只是選項卡正在關閉,甚至頁面url被重定向到其他網址。這裏最大的問題是,當頁面「關閉」時,所有連接和其他內容都被丟棄了!因此,即使您在頁面處理之前幾毫秒發送POST請求,連接將被終止的可能性也很大。這就是爲什麼我建議您在$ .post函數調用後使用prompt的原因。我會嘗試創建樣本,但我不能承諾任何事情。 – 2012-04-22 22:36:38

3

這不是這樣做的正確方法......假設操作系統掛起或瀏覽器過程中發生了什麼,然後這個事件不會被解僱。並且您永遠不會知道用戶何時離開,在他/她斷開連接後仍然顯示在線狀態。相反,你可以做的是。

  1. 嘗試連接的插座,這樣就可以知道什麼時候插座斷開
  2. 可以(每1秒後說)向服務器發送一個請求的用戶斷開連接,這樣就可以知道,用戶仍然連接。如果您沒有收到請求 - 即使在2秒後 - 斷開用戶連接。
+0

我不知道該怎麼做,你有沒有例子? – Majo0od 2012-04-22 22:40:18

+0

你用什麼服務器端? asp.net? – 2012-04-22 22:41:33

+1

他正在使用PHP。這裏有很好的源代碼,可以幫助你開始https://github.com/nicokaiser/php-websocket另外它還有SWF對象,用於不支持web sockects的瀏覽器的套接字實現。 – 2012-04-22 22:44:50

0

這與上面的答案有關。 https://stackoverflow.com/a/10272651/1306144

這將每1秒執行一次ajax調用。 (1000)

function callEveryOneSec() { 
    $jx.ajax({}); // your ajax call 
} 

setInterval(callEveryOneSec, 1000); 
+1

我認爲發送AJAX每一秒可以殺死服務器時,將是許多用戶... – Siper 2017-03-23 22:07:29