Событие Beforeunload не срабатывает после обновления страницы Chrome

elarmando спросил: 12 мая 2018 в 03:45 в: javascript

У меня есть этот простой код

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

Я хочу, чтобы события разгрузки или раньше были запущены после обновления страницы. Этого не происходит в Chrome Versión 67.0.3396.62. Я попробовал firefox, и он работает хорошо. Он также работает, когда я закрываю вкладку. Ошибка возникает только при обновлении страницы.

1 ответ

Есть решение
Louis ответил: 21 мая 2018 в 10:43

У вас возникла проблема, о которой уже сообщалось. Это похоже на ошибку, но в соответствии с Chrome dev (kozy) это функция:

Спасибо за воспроизведение. Это на самом деле особенность. Как только вы нажмете перезагрузку, мы проигнорируем все точки останова до перезагрузки страницы. Это полезно всегда, когда у вас много точек останова, и вам нужно перезагрузить страницу, чтобы перезапустить сеанс отладки.

Обходной путь: вместо нажатия кнопки перезагрузки вы можете перейти к тому же URL-адресу, используя omnibox, затем все точки останова будут работать, как ожидалось.

Я добавил смелый акцент, чтобы указать на обходное решение, предложенное kozy. Я пробовал это и обнаружил, что он работает.

Помимо проблемы с оператором debugger, обработчики выполняются независимо от того, перезагружаете ли вы или закрываете вкладку. В обоих случаях, которые приведены ниже, я получаю подсказку с предложением, которую предоставляет Chrome при возврате true:

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

Это тоже работает:

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

Раньше считалось, что вы можете использовать возвращаемое значение с сообщением, и браузер отобразит ваше собственное сообщение, но браузеры, как правило, больше не поддерживают это.

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