判斷瀏覽器到底是關閉還是刷新?準確性超高

最近糾結在一個問題上,研究瀏覽器的關閉事件,百度了一大堆,發現沒有關閉事件。相關文章如下所講:

http://bbs.csdn.net/topics/330239056

http://www.cnit618.com/html/qdkf/js/1338.htm

http://zhidao.baidu.com/link?url=ULiLZsVjyB43Tz1p0Lkc6BP9ZTQwoMKrfq-OkZ69i32oXJjWbD40e62r0xrnrhypRXk5UZwQxL1z0F3rf6CZ2a

在這些文章裏面大多數都是引用摘抄人家的,並且很多都是錯誤的,只有這一點感覺有幫助:

頁面加載時只執行onload
頁面關閉時只執行onunload
頁面刷新時先執行onbeforeunload,然後onunload,最後onload。

經過驗證我得出的結論是:

//對於ie,谷歌,360:

//頁面加載時只執行onload
//頁面刷新時,刷新之前執行onbeforeunload事件,在新頁面即將替換舊頁面時onunload事件,最後onload事件。
//頁面關閉時,先onbeforeunload事件,再onunload事件。
//對於火狐:
//頁面刷新時,只執行onunload;頁面關閉時,只執行onbeforeunload事件

那麼迴歸正題,到底怎樣判斷瀏覽器是關閉還是刷新?我按照網上的各種說法實驗千百遍,都未成功,其中各種說法如下:

window.onbeforeunload = function() //author: meizz     

{     

       var n = window.event.screenX - window.screenLeft;     

       var b = n > document.documentElement.scrollWidth-20;     

       if(b && window.event.clientY < 0 || window.event.altKey)     

       {     

              alert("是關閉而非刷新");     

              window.event.returnValue = ""; //這裏可以放置你想做的操作代碼     

       }else

       {     

              alert("是刷新而非關閉");      

       }     

}   

window.onbeforeunload = function() //author: meizz  

{  

       var n = window.event.screenX - window.screenLeft;  

       var b = n > document.documentElement.scrollWidth-20;  

       if(b && window.event.clientY < 0 || window.event.altKey)  

       {  

              alert("是關閉而非刷新");  

              window.event.returnValue = ""; //這裏可以放置你想做的操作代碼  

       }else

       {  

              alert("是刷新而非關閉");   

       }  


function CloseOpen(event) {
 

                   if(event.clientX<=0 && event.clientY<0) {
 
                          alert("關閉");
 
                   }
 
                   else
 
                   {
 
                          alert("刷新或離開");
 
                   }
 
            }
 
     </script>
 
     <body onunload="CloseOpen(event)">

..........................

這些方法都不管用,但是我並沒有放棄,想啊想啊........

按照上面我得出結論,

//對於ie,谷歌,360:

//頁面加載時只執行onload
//頁面刷新時,刷新之前執行onbeforeunload事件,在新頁面即將替換舊頁面時onunload事件,最後onload事件。
//頁面關閉時,先onbeforeunload事件,再onunload事件。
//對於火狐:
//頁面刷新時,只執行onunload;頁面關閉時,只執行onbeforeunload事件

刷新的時候先onbeforeunload,然後取服務端請求數據在新頁面即將替換舊頁面時onunload事件,而頁面關閉時,先onbeforeunload事件,再立即onunload事件。那麼在刷新的時候,onbeforeunloadonunload之間的時間肯定比關閉的時候時間長,經過測試確實如此。

貼出我的測試代碼:

    var _beforeUnload_time = 0, _gap_time = 0;
    var is_fireFox = navigator.userAgent.indexOf("Firefox")>-1;//是否是火狐瀏覽器
    window.onunload = function (){
        _gap_time = new Date().getTime() - _beforeUnload_time;
        if(_gap_time <= 5)
            $.post(pathName+"/back/bi!aaaa.s2?t="+_beforeUnload_time,{msg:"瀏覽器關閉",time:_gap_time},function(json){},"text");
        else
            $.post(pathName+"/back/bi!aaaa.s2?t="+_beforeUnload_time,{msg:"瀏覽器刷新",time:_gap_time},function(json){},"text");
    }
    window.onbeforeunload = function (){
        _beforeUnload_time = new Date().getTime();
        if(is_fireFox)//火狐關閉執行
            $.post(pathName+"/back/bi!aaaa.s2?t="+_beforeUnload_time,{msg:"火狐關閉"},function(json){},"text");
    };

服務端代碼(SSH實現):

public void aaaa(){
        System.out.println(base.getParameter("msg")+",間隔:"+base.getParameter("time"));
    }

對於if(_gap_time <= 5),此處的5是我預設的,按照客戶端瀏覽器而定,也與客戶端的機器配置有關係,我的機器關閉瀏覽器時onbeforeunload事件與onunload事件的數據間隔不超過2ms,而刷新時的間隔100%大於2ms,因爲要訪問服務器。下面貼出我的測試結果:

wKioL1ap5H2iz46HAACsj8mFib0458.png

上面結果,如有錯誤,歡迎指正。本人QQ:798171101

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