2012-02-10 59 views
1

我想在用戶關閉瀏覽器窗口時通知服務器。在窗口卸載時沒有時間發送獲取請求

我嘗試了所有的

$(window).bind("beforeunload", function() { 
    $.get("${contextPath}/notify?direction=logout"); 
}); 

$(window).unload(function() { 
    $.get("${contextPath}/notify?direction=logout"); 
}); 

$(window).unload(function() { 
    $.ajax({ 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 

但既不工作做好了,儘管事實上,它是在手動,它可能說應該。

在Firefox中,我沒有隻在窗口關閉時發出通知,但在頁面刷新時沒有通知。在Chrome中我都沒有。

我試圖在Firebug或Chrome開發人員工具中跟蹤此腳本,發現它在跟蹤時已開始工作!所以我認爲它不能正常工作,因爲它沒有時間在窗口關閉或導航之前發送請求。

這是真的嗎?如何完成我的任務?

SOLUTION

這工作:

$(window).bind("beforeunload", 
    function() { 
     $.ajax({ 
      async: false, 
      url: 'notify' 
     }); 
    } 
); 
+0

首先想到:AJAX是這個工作的錯誤工具。你應該使用SJAX(同步),AJAX通過定義釋放GUI線程來繼續處理[在這種情況下是卸載]。 – Shad 2012-02-10 22:18:27

+0

看看這個答案:http://stackoverflow.com/a/9234785/252780 – 2012-02-10 22:20:15

回答

3

這是非常棘手的,因爲瀏覽器不會等待,直到響應來得Ajax請求可能會中止。

你可以在beforeunload事件中嘗試這樣的事情。

$(window).bind("beforeunload", function() { 
    $.ajax({ 
     async: false,//This will make sure the browser waits until request completes 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 
+0

這是不可靠的,雖然你可以「嘗試」,它可能工作,它永遠不應該在生產環境中使用。 – 2012-02-10 22:46:50

0

你的運氣了,這將是不可能的,如果JavaScript的網頁上執行卸載阻止了用戶退出的頁面。

想象一下所有的垃圾郵件。

在某些瀏覽器上,卸載事件將觸發,但在您的腳本和頁面清理之間將發生競態條件。

感謝

0

我不想說這是一個評論,因爲我在做這個 場景很長一段時間了。當最終用戶意外或故意關閉瀏覽器時,我會將所有信息保存到服務器 。我 會告訴你..這是工作很好。,

我說工作很好嗎?那麼它只是在Firefox和IE瀏覽器。它 在許多其他瀏覽器(如Opera,Safari)中失敗。

所以我的建議是不依賴於這些功能,因爲它們只是針對瀏覽器的 。

1

即使這是可能的,我仍然不會推薦它。 如果你設法得到這個工作,它不會在所有瀏覽器中工作,我仍然完全建議它。

如果您非常想知道用戶何時離開您的域,請使用輪詢或帶有後備的websockets。

您也可以給cookie一個短暫的超時時間,並在網站上定期更新它們,這樣的技巧甚至會起作用。

此外,它在追蹤時「開始」工作,因爲事件在下一頁開始加載之前被觸發。已經有一段時間了,但是我上次玩過這些事件,但是一些瀏覽器可能會在下一頁加載時執行代碼一段時間。

+0

我的任務不是100%的可靠性,因爲我有像你說的備份解決方案。定期輪詢的問題是速度不夠快。所以我需要一個快速的解決方案,可以與一些瀏覽器一起使用。 – Dims 2012-02-12 19:02:20

相關問題