我在我的网站上添加了“确认您要离开”对话框,并且正在遇到onbeforeunload事件的奇怪行为。

docs非常清楚:如果您的页面即将被卸载,则调用此事件。当您的eventHandler返回一个字符串时,将要求用户进行确认。根据浏览器的不同,字符串可能会显示给他。

但是在一个小的示例网站中,我注意到beforeunload仅在用户以某种方式与该网站进行交互时才被触发。这是我的测试设置:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8" />
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">
    </script>
    <script type="text/javascript">
        window.onload = function () {
            $("#placeholder").text("website loaded")
            window.onbeforeunload = function () {
                return "Reloading the page will reset the survey!";
            }
        }
    </script>
</head>

<body>
    <p id='placeholder'></p>
</body>

</html>


加载窗口时,段落文本将更改,并且注册了beforeunload的eventHandler。如果我将其加载到Firefox中,则该段落将立即更改。

但是,如果我关闭标签页或重新加载标签页,则无需确认。仅当我单击网站时,才会显示确认对话框。来回切换标签页还不够,仅等待大约10秒钟是不够的。

chrome中的行为是相同的。

单击网站后,总是会要求您确认。我可以重点关注另一个选项卡并关闭该示例(通过右键单击并单击“关闭选项卡”),它要求确认。或另一个标签集中,我尝试关闭浏览器,它要求确认。

这是怎么回事,如何确保在卸载站点之前始终触发该事件?

这是一个视频:
javascript - Javascript:何时触发onb​​eforeunload?-LMLPHP

最佳答案

事件触发,但可能不会显示确认。从MDN


  注意:为防止意外弹出窗口,浏览器可能不会显示提示
  除非页面已经被创建,否则在beforeunload事件处理程序中创建
  与之互动,甚至可能根本不显示它们。

10-07 18:41