基于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 相关文章推荐
由JavaScript技术实现的web小游戏(不含网游)
Jun 12 Javascript
获取当前点击按钮的id用this.id实现
Mar 17 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
Aug 19 Javascript
jquery ui dialog替代confirm实例分析
Jan 25 Javascript
三种AngularJS中获取数据源的方式
Feb 02 Javascript
Bootstrap3.0学习教程之JS折叠插件
May 27 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
Dec 08 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
jquery手机触屏滑动拼音字母城市选择器的实例代码
Dec 11 jQuery
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 jQuery
JS使用canvas中的measureText方法测量字体宽度示例
Feb 02 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 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(1)
2006/10/09 PHP
一个域名查询的程序
2006/10/09 PHP
PHP利用REFERER根居访问来地址进行页面跳转
2013/09/28 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
php扩展开发入门demo示例
2019/09/23 PHP
js url传值中文乱码之解决之道
2009/11/20 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
javascript生成大小写字母
2015/07/03 Javascript
javascript 用函数实现继承详解
2016/05/28 Javascript
vue多级多选菜单组件开发
2020/09/08 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
Python中的迭代器漫谈
2015/02/03 Python
python去除文件中空格、Tab及回车的方法
2016/04/12 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
python 性能提升的几种方法
2016/07/15 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
使用Pycharm分段执行代码
2020/04/15 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
庆祝教师节活动方案
2014/01/31 职场文书
高中生学期学习自我评价
2014/02/24 职场文书
离职证明格式样本
2015/06/12 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
python周期任务调度工具Schedule使用详解
2021/11/23 Python
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android