基于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 相关文章推荐
TreeView 用法(有代码)(asp.net)
Jul 15 Javascript
30分钟就入门的正则表达式基础教程
Feb 25 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
Dec 27 Javascript
jquery对table中各数据的增加、保存、删除操作示例
May 14 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
一个jquery实现的不错的多行文字图片滚动效果
Sep 28 Javascript
微信小程序前端源码逻辑和工作流
Sep 25 Javascript
vue实现表格增删改查效果的实例代码
Jul 18 Javascript
vue2实现数据请求显示loading图
Nov 28 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
Feb 05 Javascript
js实现跟随鼠标移动的小球
Aug 26 Javascript
JavaScript对象原型链原理解析
Jan 22 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 变量定义和变量替换的方法
2009/07/30 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JS制作手机端自适应缩放显示
2015/06/11 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
深入解析jQuery中Deferred的deferred.promise()方法
2016/05/03 Javascript
js实现密码强度检验
2017/01/15 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
python实现简单点对点(p2p)聊天
2017/09/13 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
基本款天堂:Everlane
2017/05/13 全球购物
通信工程专业女生个人求职信
2013/09/21 职场文书
招商经理岗位职责
2013/11/16 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
党在我心中演讲稿
2014/09/02 职场文书
解放思想演讲稿
2014/09/11 职场文书
民间个人借款协议书
2014/09/30 职场文书
工作失误检讨书
2015/01/26 职场文书
2019求职信大礼包
2019/05/15 职场文书
Nginx配置SSL证书出错解决方案
2021/03/31 Servers
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL