JavaScript當頁面關閉時向後臺發送請求

今天做項目時遇上一個需求,當瀏覽器或頁面關閉時將數據存儲到數據庫內。實現思想是採用js監測onunload然後發送請求。結果失敗,刷新可以發送但是關閉並不能,整了一整天並沒有解決,最後找到了解決辦法。

先貼個能實現功能的方法:

function saveStatus(){
    /*結束時保存設備狀態*/
    window.onbeforeunload=function(){//必須使用beforeunload
        var url ="device_saveDeviceStatus";
        $.ajax({
            url:url,
            async:false                //必須採用同步方法
        });
    }
}
saveStatus();

  1.一開始的想法是採用onunload方法,但最後經過查詢,需要使用onbeforeunload方法。它們之間的區別在於:onbeforeunload是正要去服務器讀取新的頁面時調用,此時還沒開始讀取;而onunload則已經從服務器上讀到了需要加載的新的頁面,在即將替換掉當前頁面時調用。onunload是無法阻止頁面的更新和關閉的。而 onbeforeunload 可以做到。

  2.在發送請求上,一開始採用簡單的$.post(),但是$.post()是異步的方法,不行。爲什麼這裏不能採用異步方法呢?我的理解是,如果採用異步方法,那麼瀏覽器會在方法成功發送並響應前先unload,從而導致請求丟失。如果採用的是同步方法,瀏覽器就會等待請求成功,然後再unload。按照這個理解,如果採用異步方法發送後,再採用alert()進行攔截等待,應該也是可以的,只是這個方法太影響體驗,所以拋棄。

  附:提供一個替代的想法,在j2ee開發中,可以採用監聽器監聽session的銷燬事件,達到類似的效果。

 

轉自:https://www.cnblogs.com/qbzf-Blog/p/6341301.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章