js判断浏览器窗口(选项卡)的关闭与刷新(原版)

今日项目遇到一个问题,有一个功能会在浏览器的主窗口中新开一个窗口,然后业务要求:关闭新窗口的时候往后端发个请求,刷新的时候不发送。知道有个onbeforeunload事件是用于捕获关闭浏览器事件(包括刷新)的,但刷新也会走此方法,所以行不通,于是就网上找了找资料,网上回答的最多的大致是这样的

window.onbeforeunload = function() {
//鼠标相对于用户屏幕的水平位置 - 窗口左上角相对于屏幕左上角的水平位置 = 鼠标在当前窗口上的水平位置
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){
    //关闭浏览器时你想做的事
alert("关闭");
}else if(event.clientY > document.body.clientHeight || event.altKey){
   //刷新浏览器时你想做的事
alert("刷新");
}
}

但是,这个方法是监听浏览器右上角的关闭事件的,我想要的是选项卡的关闭与刷新事件,下面我们先来分析一下关闭窗口相关的几个方法

页面关闭时先执行onbeforeunload,然后onunload
页面刷新时先执行onbeforeunload,然后onunload,最后onload。

从上面的分析中,发现关闭与刷新都会走onbeforeunload与onunload,如果我们认为用这两个方法无法区分关闭与刷新事件,那就大错特错了,正因为关闭与刷新事件都会走onbeforeunload与onunload,所以我们利用了一个关键点就能区分出这两种,那就是:时间差

最终解决方法
var beginTime = 0;//执行onbeforeunload的开始时间
var differTime = 0;//时间差
window.onunload = function (){
differTime = new Date().getTime() - beginTime;
if(differTime <= 5) {
console.log("浏览器关闭")
$.ajax({
type: "POST",
url:url,
dataType: "JSON",
cache: false,
success: function(msg){
console.log(msg);
},
error:function(err){
console.log(err)
}
})
}else{
console.log("浏览器刷新")
}

}
window.onbeforeunload = function (){
beginTime = new Date().getTime();
};

分析:虽然刷新与关闭都会走onbeforeunload与onunload,但可能因为刷新在加载新页面前内部机制还需要做一些准备工作,所以刷新事件在执行到onunload事件时,用的时间会比关闭事件时间长,在我的测试页面中,页面里面没啥内容,关闭时onbeforeunload与onunload的时间差一般会在3毫秒内,而刷新事件的时间差一般会在10毫秒以上,当我真正用到项目中的时候(真正的项目页面中就有很多内容了),刷新事件的时间差竟能达到100毫秒左右,而关闭事件时间差还是3毫秒左右,这就大大保证了此方法的准确率,所以,判断浏览器窗口或者说是选项卡的关闭与刷新,此方法是比较合适的。
---------------------
作者:微行
来源:CSDN
原文:https://blog.csdn.net/itlsq/article/details/81095323
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/YanSmallKind/p/11229559.html

时间: 2024-08-25 03:18:17

js判断浏览器窗口(选项卡)的关闭与刷新(原版)的相关文章

js判断浏览器窗口(选项卡)的关闭与刷新

// 设置localStorage的过期时间var beginTime = 0; //执行onbeforeunload的开始时间var differTime = 0; //时间差window.onunload = function() { differTime = new Date().getTime() - beginTime; if (differTime <= 5) { console.log("浏览器关闭"); localStorage.clear(); } else {

js 判断浏览器关闭事件 兼容所有浏览器

无论是从页签处关闭浏览器,还是关闭整个浏览器窗口,无论是 ie11,火狐,谷歌,苹果,还是ie6,都能兼容的浏览器关闭事件监听 在网上搜索了一天,虽然网上也有之类的代码,但是太繁琐,有时候还不可用.我也是在原有基础上修改的.经过了上述的浏览器测试,如果有不兼容的,欢迎提出意见一起学习. ? <script type="text/jscript" src="jquery-1.10.2.min.js"></script> <script t

js判断浏览器类型

js判断浏览器类型  <script type="text/javascript" >     <!--   function getOs()   {       var OsObject = "";      if(isIE = navigator.userAgent.indexOf("MSIE")!=-1) {           return "MSIE";      }      if(isFiref

js判断浏览器:获取浏览器的名称和版本

<script> document.write("You are running" + navigator.appName); document.write(" and its version is " + navigator.appVersion); </script> 读取浏览器的名称和版本,通常称为 浏览器嗅探(browser sniffing). (from:深入浅出JavaScript 2007) js判断浏览器:获取浏览器的名称和

转载 js判断浏览器

$scope.identifyBrowser= function () { var userAgent = navigator.userAgent, rMsie = /(msie\s|trident.*rv:)([\w.]+)/, rFirefox = /(firefox)\/([\w.]+)/, rOpera = /(opera).+version\/([\w.]+)/, rChrome = /(chrome)\/([\w.]+)/, rSafari = /version\/([\w.]+).

JS判断浏览器类型的方法总结(IE firefox chrome opera safari)

JS判断浏览器类型的方法总结,可判别当前客户端所使用的浏览器是ie,firefox,safari,chrome或者是opera,另外js可以精确判断到ie浏览器的版本,依然直接上代码,需要的朋友可按照自己的要求进行修改. 第一种方法: 1 var Browser=new Object(); 2 Browser.isMozilla=(typeof document.implementation!='undefined')&&(typeof document.implementation.cr

JS判断浏览器类型方法

在网站前端开发中,浏览器兼容性问题本已让我们手忙脚乱,Chrome的出世不知道又要给我们添多少乱子.浏览器兼容性是前端开发框架要解决的第一个问题,要解决兼容性问题就得首先准确判断出浏览器的类型及其版本. JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的.在许多情况下,值判断出浏览器类型之后,还需判

YJ智能框架--JS判断浏览器类型及版本

YJ智能框架--JS判断浏览器类型及版本以下 1 /** 2 * 判断用的是那个浏览器,操作系统,浏览器使用的内核 3 */ 4 (function() { 5 var ua = navigator.userAgent || ""; 6 YJ.browser = ""; 7 if (document.recalc || document.documentMode) { 8 YJ.browser = "ie"; 9 } 10 if (window.

web开发之浏览器(二)----JQuery或JS判断浏览器内核版本号以及是否支持W3C盒子模型

1,JQuery或JS判断浏览器内核版本号以及是否支持W3C盒子模型 jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support .在更新的 2.0 版本中,将不再支持 IE 6/7/8. 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9.  以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9及以下的版本. 如果要全面支持 IE,并混合使用 jQuery 1.9及以下 和