本文是小編總結的一些核心內容,個人感覺對大家有所幫助,具體內容請看下文:
頁面加載時只執行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事件。那麼在刷新的時候,onbeforeunload與onunload之間的時間肯定比關閉的時候時間長,經過測試確實如此。
貼出我的測試代碼:
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,因為要訪問服務器。下面貼出我的測試結果:
下面給大家介紹浏覽器關閉監聽事件,判斷刷新還是關閉
使用onunload或onbeforeunload可以監聽浏覽器關閉事件,但是無法區分關閉與刷新。以下js代碼可以部分監聽關閉浏覽器的事件!
//鼠標相對於用戶屏幕的水平位置 - 窗口左上角相對於屏幕左上角的水平位置 = 鼠標在當前窗口上的水平位置 var n = window.event.screenX - window.screenLeft; //鼠標在當前窗口內時,n<m,b為false;鼠標在當前窗口外時,n>m,b為true。20這個值是指關閉按鈕的寬度 var b = n > document.documentElement.scrollWidth-20; //鼠標在客戶區內時,window.event.clientY>0;鼠標在客戶區外時,window.event.clientY<0 if(b && window.event.clientY < 0 || window.event.altKey || window.event.ctrlKey){ 關閉浏覽器時你想做的事 }else if(event.clientY > document.body.clientHeight || event.altKey){ 關閉浏覽器時你想做的事 }
這段js能監聽到鼠標點擊浏覽器關閉按鈕、浏覽器狀態欄鼠標右鍵彈出菜單中的關閉以及各種快捷鍵。但是雙擊浏覽器坐上角圖標關閉浏覽器和關閉標簽頁無法監聽。
以上所述是本文的全部內容,寫的不好還請各位大俠多多提出寶貴意見。