基于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 select标签操作代码段
May 16 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
Sep 25 Javascript
js获得参数的getParameter使用示例
Feb 26 Javascript
浅谈JavaScript 框架分类
Nov 10 Javascript
JavaScript返回0-1之间随机数的方法
Apr 06 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
Nov 22 Javascript
JS根据生日月份和日期计算星座的简单实现方法
Nov 24 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
Jan 11 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
JavaScript输出所选择起始与结束日期的方法
Jul 12 Javascript
详解React项目中碰到的IE问题
Mar 14 Javascript
JS字符串补全方法padStart()和padEnd()
May 27 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
php 读取输出其他文件的实现方法
2016/07/26 PHP
PHP更安全的密码加密机制Bcrypt详解
2017/06/18 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
JS实现的自定义网页拖动类
2015/11/06 Javascript
JavaScript脚本库编写的方法
2015/12/09 Javascript
Jquery ajax请求导出Excel表格的实现代码
2016/06/08 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
jQuery序列化后的表单值转换成Json
2017/06/16 jQuery
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
vue.js语法及常用指令
2017/10/29 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
微信小程序实现简单评论功能
2018/11/28 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
Python实现的简单dns查询功能示例
2017/05/24 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
2020/02/11 Python
Python callable内置函数原理解析
2020/03/05 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
2020/04/16 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
python搜索算法原理及实例讲解
2020/11/18 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
精彩的英文自荐信
2014/01/30 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
python批量更改目录名/文件名的方法
2021/04/18 Python
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python