检测浏览器或选项卡closures

是否有任何跨浏览器的JavaScript / jQuery代码来检测浏览器或浏览器选项卡是否被closures,但不是由于链接被点击?

如果我正确地得到你,你想知道一个标签/窗口何时被有效closures。 那么,AFAIK在Javascript中检测这种东西的唯一方法是onunloadonbeforeunload事件。

不幸的是(或者幸运的是),当你通过link或浏览器后退button离开网站时,这些事件也会被激发。 所以这是我可以给的最好的答案,我不认为你可以在Javascript本地检测到一个纯粹的close 。 纠正我,如果我在这里错了。

从Firefox文档

由于某些原因,基于Webkit的浏览器不符合对话框的规范。 从下面的例子可以看出一个几乎是交叉的例子。

 window.addEventListener("beforeunload", function (e) { var confirmationMessage = "\o/"; (e || window.event).returnValue = confirmationMessage; //Gecko + IE return confirmationMessage; //Webkit, Safari, Chrome }); 

这个例子用于处理所有的浏览器。

简单的scheme

 window.onbeforeunload = function () { return "Do you really want to close?"; }; 
 <body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()"> var myclose = false; function ConfirmClose() { if (event.clientY < 0) { event.returnValue = 'You have closed the browser. Do you want to logout from your application?'; setTimeout('myclose=false',10); myclose=true; } } function HandleOnClose() { if (myclose==true) { //the url of your logout page which invalidate session on logout location.replace('/contextpath/j_spring_security_logout') ; } } 

/ /这是在IE7中工作,如果你只closures标签或浏览器只有一个选项卡

对不起,我无法给现有的答案添加评论,但是如果你想实现一种警告对话框,我只想提一下,任何事件处理函数都有一个参数 – 事件。 在你的情况下,你可以调用event.preventDefault()来禁止自动离开页面,然后发出你自己的对话框。 我认为这是一个更好的select比使用标准的丑陋和不安全的警报()。 我个人实现了基于kendoWindow对象(Telerik的Kendo UI,除了kendoGrid和kendoEditor几乎完全开放源代码)之外的一组对话框。 你也可以使用jQuery UI中的对话框。 请注意,虽然这样的事情是asynchronous的,你将需要绑定一个处理程序到每个button的onclick事件,但是这很容易实现。

但是,我确实认为,缺乏真正的closures事件是非常糟糕的:例如,如果你想在后台重置会话状态,那么只有在真正closures的情况下,这是一个问题。

当浏览器或选项卡closures时,我需要自动将用户注销,而当用户导航到其他链接时,则不会。 发生这种情况时,我也不希望显示确认提示。 经过一段时间的挣扎之后,特别是IE和Edge,在结束这个答案的基础上,我结束了这个工作(检查IE 11,Edge,Chrome和Firefox)。

首先,在JS中的beforeunload事件处理程序中的服务器上启动一个倒数计时器。 对于IE和Edge,ajax调用需要同步才能正常工作。 你也需要使用return; 以防止确认对话框显示如下:

  window.addEventListener("beforeunload", function (e) { $.ajax({ type: "POST", url: startTimerUrl, async: false }); return; }); 

启动定时器将cancelLogout标志设置为false 。 如果用户刷新页面或导航到另一个内部链接,则服务器上的cancelLogout标志设置为true 。 一旦定时器事件结束,它会检查cancelLogout标志,看看注销事件是否已被取消。 如果定时器已被取消,则会停止定时器。 如果浏览器或选项卡已closures,那么cancelLogout标志将保持为false ,并且事件处理程序会将用户注销。

实现注意事项:我正在使用ASP.NET MVC 5,并取消注销重写Controller.OnActionExecuted()方法。

 $(window).unload( function () { alert("Bye now!"); } ); 

没有事件发生,但截至撰写本文时,所有主stream浏览器都支持window.closed属性。 因此,如果你真的需要知道你可以轮询窗口来检查该属性。

if(myWindow.closed){do things}

注意:轮询任何事情通常不是最好的解决scheme。 如果可能,应该使用window.onbeforeunload事件,唯一需要注意的是,如果你离开,它也会触发。

 window.onbeforeunload = function() { console.log('event'); return false; //here also can be string, that will be shown to the user } 

试试这个,我相信这会对你有用。

 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type='text/javascript'> $(function() { try{ opera.setOverrideHistoryNavigationMode('compatible'); history.navigationMode = 'compatible'; }catch(e){} function ReturnMessage() { return "wait"; } function UnBindWindow() { $(window).unbind('beforeunload', ReturnMessage); } $(window).bind('beforeunload',ReturnMessage ); }); </script> 
 window.onbeforeunload = function () { if (isProcess > 0) { return true; } else { //do something } }; 

如果在浏览器的任何进程中closures窗口或刷新页面,此function将显示一个确认对话框。此function适用于所有浏览器。您必须在您的ajax进程中设置isProcess var。

 window.addEventListener("beforeunload", function (e) { var confirmationMessage = "tab close"; (e || window.event).returnValue = confirmationMessage; //Gecko + IE sendkeylog(confirmationMessage); return confirmationMessage; //Webkit, Safari, Chrome etc. }); 

尝试这个。 它会工作。 jquery卸载方法是depreceted。

 window.onbeforeunload = function(event) { event.returnValue = "Write something clever here.."; }; 
 <script type="text/javascript" language="Javascript"> function DetectBrowserExit() { alert('Execute task which do you want before exit'); } window.onbeforeunload = function(){ DetectBrowserExit(); } </script> 

我在以下Web浏览器中testing了这个脚本:目前,Opera浏览器不支持onBeforeUnload事件。 Internet Explorer Mozilla Firefox Google Chrome Safari