本文是小編總結(jié)的一些核心內(nèi)容,個人感覺對大家有所幫助,具體內(nèi)容請看下文:
頁面加載時只執(zhí)行onload 
頁面關(guān)閉時只執(zhí)行onunload 
頁面刷新時先執(zhí)行onbeforeunload,然后onunload,最后onload。
經(jīng)過驗證我得出的結(jié)論是:
//對于ie,谷歌,360:
//頁面加載時只執(zhí)行onload
//頁面刷新時,刷新之前執(zhí)行onbeforeunload事件,在新頁面即將替換舊頁面時onunload事件,最后onload事件。
//頁面關(guān)閉時,先onbeforeunload事件,再onunload事件。
//對于火狐:
//頁面刷新時,只執(zhí)行onunload;頁面關(guān)閉時,只執(zhí)行onbeforeunload事件
那么回歸正題,到底怎樣判斷瀏覽器是關(guān)閉還是刷新?我按照網(wǎng)上的各種說法實驗千百遍,都未成功,其中各種說法如下:
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("是關(guān)閉而非刷新"); window.event.returnValue = ""; //這里可以放置你想做的操作代碼 }else{ alert("是刷新而非關(guān)閉"); } } 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("是關(guān)閉而非刷新"); window.event.returnValue = ""; //這里可以放置你想做的操作代碼 }else{ alert("是刷新而非關(guān)閉"); } }和
function CloseOpen(event) {if(event.clientX<=0 && event.clientY<0) {alert("關(guān)閉");}else{alert("刷新或離開");}}</script><body onunload="CloseOpen(event)">..........................
這些方法都不管用,但是我并沒有放棄,想啊想啊........
按照上面我得出結(jié)論,
//對于ie,谷歌,360:
//頁面加載時只執(zhí)行onload
//頁面刷新時,刷新之前執(zhí)行onbeforeunload事件,在新頁面即將替換舊頁面時onunload事件,最后onload事件。
//頁面關(guān)閉時,先onbeforeunload事件,再onunload事件。
//對于火狐:
//頁面刷新時,只執(zhí)行onunload;頁面關(guān)閉時,只執(zhí)行onbeforeunload事件
刷新的時候先onbeforeunload,然后取服務(wù)端請求數(shù)據(jù),在新頁面即將替換舊頁面時onunload事件,而頁面關(guān)閉時,先onbeforeunload事件,再立即onunload事件。那么在刷新的時候,onbeforeunload與onunload之間的時間肯定比關(guān)閉的時候時間長,經(jīng)過測試確實如此。
貼出我的測試代碼:
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:"瀏覽器關(guān)閉",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)//火狐關(guān)閉執(zhí)行$.post(pathName+"/back/bi!aaaa.s2?t="+_beforeUnload_time,{msg:"火狐關(guān)閉"},function(json){},"text");};服務(wù)端代碼(SSH實現(xiàn)):
public void aaaa(){System.out.println(base.getParameter("msg")+",間隔:"+base.getParameter("time"));}對于if(_gap_time <= 5),此處的5是我預設(shè)的,按照客戶端瀏覽器而定,也與客戶端的機器配置有關(guān)系,我的機器關(guān)閉瀏覽器時onbeforeunload事件與onunload事件的數(shù)據(jù)間隔不超過2ms,而刷新時的間隔100%大于2ms,因為要訪問服務(wù)器。下面貼出我的測試結(jié)果:

下面給大家介紹瀏覽器關(guān)閉監(jiān)聽事件,判斷刷新還是關(guān)閉
使用onunload或onbeforeunload可以監(jiān)聽瀏覽器關(guān)閉事件,但是無法區(qū)分關(guān)閉與刷新。以下js代碼可以部分監(jiān)聽關(guān)閉瀏覽器的事件!
//鼠標相對于用戶屏幕的水平位置 - 窗口左上角相對于屏幕左上角的水平位置 = 鼠標在當前窗口上的水平位置var n = window.event.screenX - window.screenLeft;//鼠標在當前窗口內(nèi)時,n<m,b為false;鼠標在當前窗口外時,n>m,b為true。20這個值是指關(guān)閉按鈕的寬度var b = n > document.documentElement.scrollWidth-20;//鼠標在客戶區(qū)內(nèi)時,window.event.clientY>0;鼠標在客戶區(qū)外時,window.event.clientY<0if(b && window.event.clientY < 0 || window.event.altKey || window.event.ctrlKey){關(guān)閉瀏覽器時你想做的事}else if(event.clientY > document.body.clientHeight || event.altKey){關(guān)閉瀏覽器時你想做的事}這段js能監(jiān)聽到鼠標點擊瀏覽器關(guān)閉按鈕、瀏覽器狀態(tài)欄鼠標右鍵彈出菜單中的關(guān)閉以及各種快捷鍵。但是雙擊瀏覽器坐上角圖標關(guān)閉瀏覽器和關(guān)閉標簽頁無法監(jiān)聽。
以上所述是本文的全部內(nèi)容,寫的不好還請各位大俠多多提出寶貴意見。
新聞熱點
疑難解答