判斷瀏覽器究竟是關閉仍是刷新?準確性超高

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

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

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

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

在這些文章裏面大多數都是引用摘抄人家的,而且不少都是錯誤的,只有這一點感受有幫助:ide

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

通過驗證我得出的結論是:測試

//對於ie,谷歌,360:url

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

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

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

相關文章
相關標籤/搜索