检测浏览器或选项卡关闭

IT技术 javascript jquery
2020-12-21 16:24:45

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

6个回答

如果我理解正确,您想知道标签/窗口何时有效关闭。好吧,AFAIKJavascript检测这种东西的唯一方法onunload&onbeforeunload事件。

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

正确的。您只能检测页面何时卸载,而不能检测窗口何时关闭。此外,onbeforeunload 是非标准的,因此并非所有浏览器都支持它。
2021-02-08 16:24:45
当然这仍然有效,他们只是Stringonbeforeunload. 因此,现在您不再能够在卸载前显示自定义消息。
2021-02-21 16:24:45
@jAndy @Guffa 我怎样才能找出哪个窗口被触发了unload
2021-02-24 16:24:45
不再适用于 chrome/opera... chromestatus.com/feature/5349061406228480
2021-03-02 16:24:45
我也想使用“关闭时”功能,但注意到我的用户偶尔会通过按 F5 来刷新屏幕。由于我的“关闭时”处理程序是在这种刷新时调用的,这意味着我不能按照我需要的方式使用它(这是一个真正的“关闭选项卡或窗口”)......该死,我们需要一个新的事件模型对于这一切!
2021-03-08 16:24:45

来自MDN 文档

由于某些原因,基于 Webkit 的浏览器不遵循对话框的规范。一个几乎交叉工作的例子与下面的例子很接近。

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

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

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

是的,我尝试了很多解决方案,最后我提出了这个,组合以获得最佳答案,并在所有浏览器上进行了测试。
2021-02-21 16:24:45
这是唯一适用于我的 chrome 浏览器的解决方案。我没有尝试任何其他人。
2021-02-27 16:24:45
无法向beforeunload提供自定义消息onbeforeunload这是 2019 年的浏览器兼容性:developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/...
2021-03-07 16:24:45
截至今天,使用所有最新版本的浏览器,在 Chrome、Firefox、Opera、IE11 和 Edge 关闭标签、导航或关闭浏览器时提示工作,并且在打开多个标签时也工作,除了 Chrome 关闭所有标签的 Chrome没有提示,至少在我的机器上。
2021-03-08 16:24:45
在仅打开选项卡的情况下使用 firefox(>= 版本 44)时,此方法在选项卡关闭时无法完美运行。
2021-03-09 16:24:45

简单的解决方案

window.onbeforeunload = function () {
    return "Do you really want to close?";
};
这也触发了页面离开事件,不仅是浏览器关闭或选项卡关闭
2021-02-22 16:24:45
这是什么魔法?(y) 它适用于所有浏览器吗?在 chrome 上效果很好
2021-02-25 16:24:45
当您刷新页面时它会触发。这是我唯一的问题。
2021-03-04 16:24:45
此解决方案不再适用于 Firefox 和 Chrome
2021-03-09 16:24:45
<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 中有效,如果您关闭选项卡或只有一个选项卡的浏览器

请注意,我们在 2007 年实施了类似的解决方案。大约一周前,该解决方案不再适用于 IE9。很久以前,它在选项卡式浏览器中停止工作(或可能从未工作过)。
2021-02-15 16:24:45
事实证明,在 IE9 中使用此代码会导致当用户用鼠标单击后退、前进或刷新按钮时弹出此消息。
2021-02-23 16:24:45
window.onunload = "alert('wait')"这样的东西真的不应该工作。“该函数应为 Event 对象的 returnValue 属性分配一个字符串值并返回相同的字符串”。请看一下MDN 文章
2021-02-26 16:24:45
是的 但是对于像 ie8、firefox 这样的多标签浏览器。使用这个有问题吗?
2021-02-27 16:24:45
在 Chromium/Ubuntu 中注入window.onunload = "alert('wait')"window.onbeforeunload = "alert('wait... chrome!')"使用了控制台,但在我关闭选项卡时都没有触发。
2021-03-01 16:24:45

对于类似的任务,您可以使用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>
卓见。用于在多个页面上一致工作的在线计时器。到目前为止,我只知道 localStorage。
2021-02-24 16:24:45