页面刷新 Chrome 后未触发 Beforeunload 事件

ela*_*ndo 5 javascript google-chrome

我有这个简单的代码

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <!--<script src="angular.min.js"></script>-->
    <script>       

        window.onload = function () {
            window.addEventListener("unload", function () {
                debugger;
            });
            window.addEventListener("beforeunload", function () {
                debugger;
            });
            window.onbeforeunload = function () {
               
            }
        }
    </script>
    
</head>
<body ng-app="app">   

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我希望在刷新页面后触发 unload 或 beforeunload 事件。这在 Chrome 版本 67.0.3396.62 中没有发生。我试过 firefox 和 edge,效果很好。当我关闭选项卡时它也有效。只有当我刷新页面时才会发生错误。

Lou*_*uis 7

您遇到了一个已经报告的问题。它看起来像一个错误,但根据Chrome 开发人员(kozy)的 说法,它是一个功能

感谢复刻。它实际上是功能。只要您按下重新加载,我们就会在页面重新加载之前忽略所有断点。当您有很多断点并且需要重新加载页面以重新启动调试会话时,它一直很有用。

解决方法:您可以使用多功能框导航到相同的 url,而不是按重新加载按钮,然后所有断点都将按预期工作。

我添加了大胆的重点来指出 kozy 提出的解决方法。我试过了,发现它有效。

除了debugger语句的问题之外,无论您是重新加载还是关闭选项卡,都会执行处理程序。在接下来的两种情况下,我都会收到 Chrome 在返回 true 时提供的股票提示:

window.addEventListener("beforeunload", function (ev) {
  ev.returnValue = true; // `return true` won't work here.
});
Run Code Online (Sandbox Code Playgroud)

这也有效:

window.onbeforeunload = function () {
  return true;
}
Run Code Online (Sandbox Code Playgroud)

过去,您可以将返回值与消息一起使用,浏览器会显示您的自定义消息,但浏览器通常不再支持这一点。

无论你想设置的处理程序beforeunload的处理程序内load完全依赖于你的目标。例如,我有一个用于编辑文档beforeunload的应用程序,它在应用程序开始初始化之前不会设置处理程序,这比load事件晚得多。该beforeunload处理器是有,以确保用户不与未保存的修改离开页面。