基于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 相关文章推荐
window.open的页面如何刷新(父页面)上层页面
Dec 28 Javascript
JavaScript前端图片加载管理器imagepool使用详解
Dec 29 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
Sep 01 Javascript
JS中对象与字符串的互相转换详解
May 20 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
Vue.js系列之项目结构说明(2)
Jan 03 Javascript
vue基于Vue2.0和高德地图的地图组件实例
Apr 28 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
Jun 08 Javascript
jQuery中ajax获取数据赋值给页面的实例
Dec 31 jQuery
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
Apr 09 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 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 IP及IP段进行访问限制的代码
2008/12/17 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
浅谈php提交form表单
2015/07/01 PHP
PHP处理会话函数大总结
2015/08/05 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
AngularJS基础 ng-hide 指令用法及示例代码
2016/08/01 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
2016/12/28 Javascript
JS脚本实现网页自动秒杀点击
2018/01/11 Javascript
Vue父组件调用子组件事件方法
2018/02/23 Javascript
详解vue中axios的封装
2018/07/18 Javascript
150行代码带你实现微信小程序中的数据侦听
2019/05/17 Javascript
小程序如何写动态标签的实现方法
2020/02/05 Javascript
python检测lvs real server状态
2014/01/22 Python
python字典多条件排序方法实例
2014/06/30 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Python解释器以及PyCharm的安装教程图文详解
2020/02/26 Python
python如何实现word批量转HTML
2020/09/30 Python
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
新加坡第一大健康与美容零售商:屈臣氏新加坡(Watsons Singapore)
2020/12/11 全球购物
super()与this()的区别
2016/01/17 面试题
C#里面如何倒序排列一个数组的元素?
2013/06/21 面试题
会计找工作求职信范文
2013/12/09 职场文书
三年大学生活自我鉴定
2014/01/21 职场文书
信息技术专业大学生职业生涯规划书
2014/01/24 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
催款函范文
2015/06/24 职场文书
学雷锋感言
2015/08/03 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB