如果您的服務器速度足以響應,此方法相當可靠。雖然有些事情要真正注意。如果關閉瀏覽器並在卸載事件時發送AJAX請求,那麼很有可能在窗口對象被銷燬之前,響應不會及時從服務器返回。在這種情況下(至少在IE中)會發生什麼情況是它將孤立你的連接對象,並且在連接超時命中之前不會正確終止它。如果您的服務器沒有啓用連接保持活動狀態,則在關閉2個窗口(同時仍打開另一個窗口)後,您將用完打開的服務器連接(對於IE6-7,對於IE8-6窗口)直到連接超時被打中,您將無法打開您的網站。
我遇到過這樣的情況,之前我打開一個彈出窗口,在卸載時發送了一個AJAX請求,這非常可靠,但它受到上述發佈的困擾,並且花了很長時間我跟蹤它並瞭解發生了什麼。之後,我做了什麼,我確保打開的窗口將具有相同的代碼來調用服務器,並在每次卸載時檢查開啓器,並在其中運行代碼(如果存在)。
看來,如果關閉最後一個瀏覽器窗口,IE將正確銷燬連接,但如果另一個窗口打開,則不會。
P.S.只是爲了評論上面的答案,AJAX並不是真正的異步。至少JS的實現不是。發送請求後,您的JS代碼仍將等待服務器的響應。它不會阻止你的代碼執行,但是由於服務器可能需要一段時間才能響應(或者足夠長的時間讓Windows終止IE窗口對象),你可能會碰到上述問題。
有沒有人試過這與異步關閉?我猜這會阻止瀏覽器卸載,直到請求返回。 – 2011-11-02 17:14:04
這是正確的。在關閉異步的情況下,瀏覽器將在卸載頁面之前等待來自服務器的響應。這有助於解決Chrome瀏覽器問題,在卸載事件和異步操作時,Chrome非常不可靠。這也將解決我上面描述的IE連接佔用問題。但它會是用戶可見的。 – 2011-11-04 19:08:33
值得關注具有'Navigator.sendBeacon'的新Beacon API,它將允許更好的方式在卸載時可靠地向我們的服務器發出異步請求:https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon – Wildhoney 2015-03-31 14:59:17