今天做項目時遇上一個需求,當瀏覽器或頁面關閉時將數據存儲到數據庫內。實現思想是采用js監測onunload然后發送請求。結果失敗,刷新可以發送但是關閉並不能,整了一整天並沒有解決,最后找到了解決辦法。
先貼個能實現功能的方法:
1 function saveStatus(){ 2 /*結束時保存設備狀態*/ 3 window.onbeforeunload=function(){//必須使用beforeunload 4 var url ="device_saveDeviceStatus"; 5 $.ajax({ 6 url:url, 7 async:false //必須采用同步方法 8 }); 9 } 10 } 11 saveStatus();
接下來來解釋一下:
1.一開始的想法是采用onunload方法,但最后經過查詢,需要使用onbeforeunload方法。它們之間的區別在於:onbeforeunload是正要去服務器讀取新的頁面時調用,此時還沒開始讀取;而onunload則已經從服務器上讀到了需要加載的新的頁面,在即將替換掉當前頁面時調用。onunload是無法阻止頁面的更新和關閉的。而 onbeforeunload 可以做到。
2.在發送請求上,一開始采用簡單的$.post(),但是$.post()是異步的方法,不行。為什么這里不能采用異步方法呢?我的理解是,如果采用異步方法,那么瀏覽器會在方法成功發送並響應前先unload,從而導致請求丟失。如果采用的是同步方法,瀏覽器就會等待請求成功,然后再unload。按照這個理解,如果采用異步方法發送后,再采用alert()進行攔截等待,應該也是可以的,只是這個方法太影響體驗,所以拋棄。
附:提供一個替代的想法,在j2ee開發中,可以采用監聽器監聽session的銷毀事件,達到類似的效果。