Javascript: когда срабатывает onbeforeunload?

Я добавляю на свой веб-сайт диалоговое окно «Подтвердите, что хотите уйти» и наблюдаю странное поведение события onbeforeunload.

документы достаточно ясны: если ваша страница вот-вот быть выгруженным, это событие вызывается. Когда ваш обработчик событий возвращает строку, у пользователя запрашивается подтверждение. В зависимости от браузера строка может отображаться ему.

Но на небольшом примере веб-сайта я заметил, что 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. Если я загружу это в Firefox, абзац сразу изменится.

Но если я закрою вкладку или перезагружу ее, подтверждения не запрашивается. Диалоговое окно подтверждения отображается только в том случае, если я нажал на веб-сайте. Переключать вкладки туда и обратно недостаточно, ждать около 10 секунд недостаточно.

В хроме такое же поведение.

После того, как я нажал на веб-сайт, всегда запрашивается подтверждение. Я могу сфокусировать другую вкладку и закрыть этот пример (щелкнув правой кнопкой мыши и «закрыть вкладку»), он запрашивает подтверждение. Либо другая вкладка сфокусирована и я пытаюсь закрыть браузер, он просит подтверждения.

Что здесь происходит, как я могу убедиться, что событие всегда срабатывает до выгрузки сайта?

Вот видео: введите здесь описание изображения


person lhk    schedule 07.03.2019    source источник
comment
Вы пробовали не оборачивать onbeforeunload в onload и посмотреть, есть ли разница?   -  person imvain2    schedule 07.03.2019
comment
просто сделал. Если я уберу onload, $ перестанет работать, поэтому абзац не изменится. Но поведение при разгрузке такое же   -  person lhk    schedule 07.03.2019
comment
Вы же сами сказали: В зависимости от браузера строка может ему отображаться. Гарантии нет. По-видимому, этот браузер решил, что если пользователь не взаимодействует со страницей, у страницы, вероятно, не будет веских причин блокировать пользователя от ухода.   -  person GolezTrol    schedule 07.03.2019
comment
Нет, это что-то другое. Строка может быть сообщением, отображаемым при запросе подтверждения - или нет. Браузер также может отображать собственный текст сообщения. Но если есть обработчик, он должен запросить подтверждение   -  person lhk    schedule 07.03.2019


Ответы (1)


Событие срабатывает, но подтверждение может не отображаться. Из MDN:

Примечание. Для борьбы с нежелательными всплывающими окнами браузеры могут не отображать подсказки, созданные в обработчиках событий beforeunload, если только страница не взаимодействовала, или даже не отображать их вообще.

person GolezTrol    schedule 07.03.2019