检测浏览器或制表符关闭

com*_*tta 272 javascript jquery

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

jAn*_*ndy 254

如果我找到你,你想知道什么时候选项卡/窗口有效关闭.好了,据我所知的唯一途径Javascript,以检测之类的东西都onunloadonbeforeunload事件.

不幸的是(或者幸运的是?),当您将网站留link在浏览器或浏览器后退按钮时,这些事件也会被触发.所以这是我能给出的最佳答案,我认为你不能close在Javascript 中原生地检测到纯粹的答案.如果我在这里错了,请纠正我.

  • 正确.您只能检测页面何时被卸载,而不是在窗口关闭时.此外,onbeforeunload是非标准的,因此并非所有浏览器都支持. (37认同)
  • 我也想使用'on close'功能,但注意到我的用户偶尔会按F5刷新屏幕.由于我的'on close'处理程序在这样的刷新时被调用,这意味着我不能以我需要它的方式使用它(这是一个真正的'关闭选项卡或窗口')...该死的,我们需要一个新的事件模型对于所有这一切! (7认同)
  • 不再适用于 chrome/opera...https://www.chromestatus.com/feature/5349061406228480 (3认同)
  • 当然这仍然有效,他们只是从 `onbeforeunload` 中删除了一个自定义的 `String` 返回值。因此,现在您不再能够在卸载前显示自定义消息。 (2认同)
  • @jAndy @Guffa 我如何找出哪个窗口触发了“unload”? (2认同)
  • @EgorDudyak 该事件是为窗口触发的。如果对多个窗口使用相同的方法,则可以使用事件对象的“target”属性。 (2认同)

moh*_*him 114

来自Firefox文档

出于某些原因,基于Webkit的浏览器不遵循对话框的规范.一个几乎交叉的例子将接近下面的例子.

window.addEventListener("beforeunload", function (e) {
  var confirmationMessage = "\o/";

  (e || window.event).returnValue = confirmationMessage; //Gecko + IE
  return confirmationMessage;                            //Webkit, Safari, Chrome
});
Run Code Online (Sandbox Code Playgroud)

此示例用于处理所有浏览器.

  • 是的,我尝试了很多解决方案,我最后来到这里,结合最佳答案,我在所有浏览器上测试它. (3认同)
  • 这是唯一适用于我的Chrome浏览器的解决方案.我没有尝试任何其他人. (2认同)

小智 44

简单解决方案

window.onbeforeunload = function () {
    return "Do you really want to close?";
};
Run Code Online (Sandbox Code Playgroud)

  • 这是什么魔法?(y)它适用于所有浏览器吗?在chrome上工作得很好 (6认同)
  • 此解决方案不再适用于Firefox和Chrome (5认同)
  • 刷新页面时会触发它.这是我唯一的问题. (3认同)
  • 这不仅在浏览器关闭或选项卡关闭时触发页面离开事件 (3认同)

小智 18

<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') ;
    }   
}
Run Code Online (Sandbox Code Playgroud)

//如果您只使用一个选项卡关闭选项卡或浏览器,则此功能在IE7中有效

  • 是的 但是对于像 ie8、firefox 这样的多标签浏览器。使用这个有问题吗? (2认同)

Syn*_*yno 10

我找到了一种适用于我所有浏览器的方法

在以下版本上进行了测试:Firefox 57、Internet Explorer 11、Edge 41、最新的 Chrome 之一(它不会显示我的版本)

注意:如果您以任何可能的方式离开页面(刷新、关闭浏览器、重定向、链接、提交...),则 onbeforeunload 会触发。如果您只希望它在浏览器关闭时发生,只需绑定事件处理程序。

  $(document).ready(function(){         

        var validNavigation = false;

        // Attach the event keypress to exclude the F5 refresh (includes normal refresh)
        $(document).bind('keypress', function(e) {
            if (e.keyCode == 116){
                validNavigation = true;
            }
        });

        // Attach the event click for all links in the page
        $("a").bind("click", function() {
            validNavigation = true;
        });

        // Attach the event submit for all forms in the page
        $("form").bind("submit", function() {
          validNavigation = true;
        });

        // Attach the event click for all inputs in the page
        $("input[type=submit]").bind("click", function() {
          validNavigation = true;
        }); 

        window.onbeforeunload = function() {                
            if (!validNavigation) {     
                // ------->  code comes here
            }
        };

  });
Run Code Online (Sandbox Code Playgroud)


dls*_*sso 9

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

if(myWindow.closed){do things}

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


Ion*_*316 7

我需要在浏览器或选项卡关闭时自动将用户注销,但不能在用户导航到其他链接时自动注销.当发生这种情况时,我也不希望显示确认提示.经过一段时间的努力,尤其是IE和Edge,这是我在完成这个答案的方法之后所做的事情(检查使用IE 11,Edge,Chrome和Firefox).

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

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

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

实现说明:我正在使用ASP.NET MVC 5,我正在取消重写Controller.OnActionExecuted()方法中的注销.


Poo*_*att 6

$(window).unload( function () { alert("Bye now!"); } );
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于 Firefox 或 Chrome。如果想显示警报,请尝试使用 `beforeunload`。像这样:`$(window).on('beforeunload', function(){ alert ('Bye now')});` (9认同)
  • 根据 jQuery 文档“大多数浏览器将忽略对 alert()、confirm() 和 prompt() 的调用” https://api.jquery.com/unload/ (5认同)

小智 6

抱歉,我无法在现有答案中添加注释,但是如果您想要实现一种警告对话框,我只想提一下,任何事件处理函数都有一个参数 - 事件.在您的情况下,您可以调用event.preventDefault()来禁止自动离开页面,然后发出自己的对话框.我认为这比使用标准的丑陋和不安全的警报()更好.我个人基于kendoWindow对象实现了我自己的一组对话框(Telerik的Kendo UI,几乎完全是开源的,除了kendoGrid和kendoEditor).您还可以使用jQuery UI中的对话框.但请注意,这些事情是异步的,您需要将处理程序绑定到每个按钮的onclick事件,但这很容易实现.

但是,我确实认为缺少真正的关闭事件是非常糟糕的:例如,如果你想在后端重置你的会话状态只是在真正关闭的情况下,这是一个问题.


Jef*_*yet 6

onunload是Chrome的答案。根据caniuse 的说法,它是跨浏览器的。但并非所有浏览器的反应都相同。

window.onunload = function(){
    alert("The window is closing now!");
}
Run Code Online (Sandbox Code Playgroud)

开发者.mozilla.org

当窗口卸载其内容和资源时,会触发这些事件。

对于

onunload仅页面关闭时执行。即使在页面刷新和导航到不同页面时它也不会执行。

对于火狐 v86.0

它根本不会执行。页面刷新,导航离开,关闭浏览器选项卡,关闭浏览器,什么都没有。

  • kta请更具体一些。 (2认同)

csa*_*as1 5

对于类似的任务,您可以用来sessionStorage在本地存储数据,直到关闭浏览器选项卡。

sessionStorage对象仅存储一个会话的数据(关闭浏览器选项卡时将删除该数据)。(W3Schools

这是我的笔

<div id="Notice">
    <span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
</div>
<script>
    $("#Notice").click(function() {
     //set sessionStorage on click
        sessionStorage.setItem("dismissNotice", "Hello");
        $("#Notice").remove();
    });
    if (sessionStorage.getItem("dismissNotice"))
    //When sessionStorage is set Do stuff...
        $("#Notice").remove();
</script>
Run Code Online (Sandbox Code Playgroud)


Cub*_*oft 5

由于尚未有人提及(8 年多后):WebSocket 可能是检测关闭选项卡的另一种有效方法。只要选项卡打开并指向主机,客户端就能够与主机保持活动的 WebSocket 连接。

警告:请注意,如果 WebSocket 不需要您已经在做的事情产生任何额外的显着开销,则此解决方案实际上仅适用于项目。

在合理的超时期限内(例如 2 分钟),服务器端可以在 WebSocket 断开连接后确定客户端已离开,并执行所需的任何操作,例如删除上传的临时文件。(在我极其专业的用例中,我的目标是在 WebSocket 连接断开并且所有 CGI/FastCGI 活动终止后三秒终止本地主机应用程序服务器- 任何其他保持活动连接都不会影响我。)

我在让 onunload 事件处理程序与信标一起正常工作时遇到问题(按照此答案的建议)。关闭选项卡似乎不会触发信标,而打开选项卡会以可能导致问题的方式触发信标。WebSocket 更干净地解决了我遇到的问题,因为连接大约在选项卡关闭的同时关闭,并且应用程序内的切换页面只是在延迟窗口内打开一个新的 WebSocket 连接。

  • 好的,可以。但是,您不能分享任何代码或程序来处理它吗?如果没有它,像我这样的菜鸟就无法理解 (2认同)