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

eeq64g8w  于 2023-06-19  发布在  Go
关注(0)|答案(2)|浏览(976)

我有这个简单的代码

<!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>

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

l5tcr1uw

l5tcr1uw1#

您遇到了已报告的issue。它看起来像一个bug,但根据Chrome开发人员(科济),它是一个功能
感谢repro。它实际上是特征。一旦你按下reload,我们就忽略页面重新加载之前的所有断点。当您有很多断点并且需要重新加载页面以重新启动调试会话时,它总是很有用。
解决方法:您可以使用omnibox导航到相同的url,而不是按reload按钮,然后所有断点将按预期工作。
我已经大胆地强调指出了科济提出的解决方案。我试过了,发现它很有效。
除了debugger语句的问题之外,无论您是重新加载还是关闭选项卡,处理程序都会执行。在下面的两种情况下,我都得到了Chrome在返回true时提供的股票提示:

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

这也起作用:

window.onbeforeunload = function () {
  return true;
}

过去,你可以使用一个返回值与消息,浏览器会显示你的自定义消息,但浏览器通常不再支持这一点。
是否要在load的处理程序中设置beforeunload的处理程序 * 完全取决于您的目标 *。例如,我有一个用于编辑文档的应用程序,它直到应用程序开始初始化才设置beforeunload处理程序,这比load事件晚得多。beforeunload处理程序用于确保用户不会在页面上留下未保存的修改。

u5rb5r59

u5rb5r592#

根据[mdn web docs][1]:
需要粘性激活。用户必须与页面进行交互才能使此功能正常工作。
您需要在重新加载之前与页面进行交互,这就是为什么它第一次工作。[1]:https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event#security

相关问题