最近糾結在一個問題上,研究瀏覽器的關閉事件,百度了一大堆,發現沒有關閉事件。相關文章如下所講:
http://bbs.csdn.net/topics/330239056
http://www.cnit618.com/html/qdkf/js/1338.htm
在這些文章裏面大多數都是引用摘抄人家的,並且很多都是錯誤的,只有這一點感覺有幫助:
頁面加載時只執行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,因爲要訪問服務器。下面貼出我的測試結果:
上面結果,如有錯誤,歡迎指正。本人QQ:798171101