基于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 相关文章推荐
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
Jquery submit()无法提交问题
Apr 21 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
Nov 17 Javascript
jquery的live使用注意事项
Feb 18 Javascript
jQuery中parentsUntil()方法用法实例
Jan 07 Javascript
用JS实现轮播图效果(二)
Jun 26 Javascript
KnockoutJS 3.X API 第四章之数据控制流component绑定
Oct 10 Javascript
详解webpack 如何集成第三方js库
Jun 29 Javascript
在vue-cli中组件通信的方法
Dec 16 Javascript
webpack多入口文件页面打包配置详解
Jan 09 Javascript
使用 Opentype.js 生成字体子集的实例代码详解
May 25 Javascript
Antd的Table组件嵌套Table以及选择框联动操作
Oct 24 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开发模式(简写版)
2007/03/15 PHP
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
PHP购物车类Cart.class.php定义与用法示例
2016/07/20 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
再论Javascript下字符串连接的性能
2011/03/05 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
javascript特殊日历控件分享
2016/03/07 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
python使用turtle库绘制树
2018/06/25 Python
Python将列表中的元素转化为数字并排序的示例
2019/12/25 Python
序列化Python对象的方法
2020/08/01 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
化工操作工岗位职责
2014/04/29 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
步步惊心观后感
2015/06/12 职场文书
《风筝》教学反思
2016/02/23 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL