基于JavaScript判断浏览器到底是关闭还是刷新(超准确)


Posted in Javascript onFebruary 01, 2016

本文是小编总结的一些核心内容,个人感觉对大家有所帮助,具体内容请看下文:

页面加载时只执行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,因为要访问服务器。下面贴出我的测试结果:

基于JavaScript判断浏览器到底是关闭还是刷新(超准确)

下面给大家介绍浏览器关闭监听事件,判断刷新还是关闭

使用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能监听到鼠标点击浏览器关闭按钮、浏览器状态栏鼠标右键弹出菜单中的关闭以及各种快捷键。但是双击浏览器坐上角图标关闭浏览器和关闭标签页无法监听。

以上所述是本文的全部内容,写的不好还请各位大侠多多提出宝贵意见。

Javascript 相关文章推荐
Prototype使用指南之form.js
Jan 10 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
详解AngularJS的通信机制
Jun 18 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
Immutable 在 JavaScript 中的应用
May 02 Javascript
js 作用域和变量详解
Feb 16 Javascript
Java与JavaScript中判断两字符串是否相等的区别
Mar 13 Javascript
js实现按座位号抽奖
Apr 05 Javascript
JS获取数组中出现次数最多及第二多元素的方法
Oct 27 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
JS实现页面跳转与刷新的方法汇总
Aug 30 Javascript
理解javascript中的严格模式
Feb 01 #Javascript
浅析JavaScript作用域链、执行上下文与闭包
Feb 01 #Javascript
jQuery 3.0 的变化及使用方法
Feb 01 #Javascript
jQuery与Ajax以及序列化
Feb 01 #Javascript
js格式化输入框内金额、银行卡号
Feb 01 #Javascript
javascript嵌套函数和在函数内调用外部函数的区别分析
Jan 31 #Javascript
JavaScript中eval函数的问题
Jan 31 #Javascript
You might like
基于PHP与XML的PDF文档生成技术
2006/10/09 PHP
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
window.onload和$(function(){})的区别介绍
2013/10/30 Javascript
用javascript对一个json数组深度赋值示例
2014/07/27 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
详解JavaScript时间处理之几个月前或几个月后的指定日期
2016/12/21 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
[04:13]2018国际邀请赛典藏宝瓶Ⅱ饰品一览
2018/07/21 DOTA
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
在Pycharm中使用GitHub的方法步骤
2019/06/13 Python
Python 实现将数组/矩阵转换成Image类
2020/01/09 Python
Python实现定时监测网站运行状态的示例代码
2020/09/30 Python
四查四看剖析材料
2014/02/14 职场文书
党员自我对照检查材料
2014/08/19 职场文书
大学生实习证明范本
2014/09/19 职场文书
先进事迹材料范文
2014/12/29 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
小学教师工作总结2015
2015/04/07 职场文书
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android