JavaScript當頁面關閉時向后台發送請求


今天做項目時遇上一個需求,當瀏覽器或頁面關閉時將數據存儲到數據庫內。實現思想是采用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的銷毀事件,達到類似的效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM