基于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 相关文章推荐
来自chinaz的ajax获取评论代码
May 03 Javascript
jquery tab标签页的制作
May 10 Javascript
JS中数组Array的用法示例介绍
Feb 20 Javascript
浅析Node.js查找字符串功能
Sep 03 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
Dec 12 Javascript
基于jquery实现即时检查格式是否正确的表单
May 06 Javascript
JS 事件绑定、事件监听、事件委托详细介绍
Sep 28 Javascript
jQuery实现可拖拽3D万花筒旋转特效
Jan 03 Javascript
微信小程序使用request网络请求操作实例
Dec 15 Javascript
vue 1.0 结合animate.css定义动画效果
Jul 11 Javascript
Vue传参一箩筐(页面、组件)
Apr 04 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 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 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
javascript 动态加载 css 方法总结
2009/07/11 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
JQuery实现表格动态增加行并对新行添加事件
2014/07/30 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
Python实现平行坐标图的两种方法小结
2019/07/04 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
解决python -m pip install --upgrade pip 升级不成功问题
2020/03/05 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
如何利用python进行时间序列分析
2020/08/04 Python
借助HTML5 Canvas来绘制三角形和矩形等多边形的方法
2016/03/14 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
医学院毕业生自荐信
2013/11/08 职场文书
初三物理教学反思
2014/01/21 职场文书
2014年教师节寄语
2014/04/03 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
施工安全标语
2014/06/07 职场文书
普通党员对照检查材料
2014/08/28 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
Python实现仓库管理系统
2022/05/30 Python