window.onbeforeunload не работает в Chrome - PullRequest
3 голосов
/ 26 января 2011

Это код, который я использовал для window.onbeforeunload ......

<head>
<script>

    window.onbeforeunload = func;

    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
    </head>

это работает с IE и mozila, но не работает с chrome ..... пожалуйста, помогите ...... заранее спасибо .....

Ответы [ 8 ]

17 голосов
/ 23 февраля 2012

Похоже, что единственное, что вы можете сделать с помощью onbeforeunload в последней версии Chrome, это установить предупреждающее сообщение.

window.onbeforeunload = function () {
    return "Are you sure";
};

Будет работать.Другой код в функции, кажется, игнорируется Chrome


ОБНОВЛЕНИЕ : Начиная с Chrome V51, возвращаемая строка будет игнорироваться и вместо этого будет отображаться сообщение по умолчанию.

11 голосов
/ 30 июня 2016

Знаю, что опоздал на это, но чесал голову, почему мое пользовательское сообщение перед загрузкой не работало в Chrome и читало это. Таким образом, в случае, если кто-то еще сделает то же самое, Chrome начиная с версии 51 и выше не поддерживает настраиваемые сообщения перед загрузкой. Очевидно, это потому, что эта функция была использована мошенниками. Вместо этого вы получаете предопределенное сообщение Chrome, которое может соответствовать вашим целям. Более подробная информация по адресу:

https://developers.google.com/web/updates/2016/04/chrome-51-deprecations?hl=en#remove-custom-messages-in-onbeforeload-dialogs

Лично я не считаю, что выбранное ими сообщение является хорошим, поскольку в нем говорится об уходе с сайта, и одно из наиболее распространенных законных применений для onbeforeunload - обработка / проверка грязных флагов в веб-форме, поэтому это не очень хорошая формулировка В большинстве случаев пользователь все еще будет на вашем сайте, просто по ошибке нажал кнопку «Отмена» или «Перезагрузить».

4 голосов
/ 18 августа 2012

Подтверждено это поведение на хроме 21.0.1180.79

это похоже на те же операции восстановления, что и на XSS, если вы обновляете страницу или открываете страницу в том же домене + порт, на котором выполняется сценарий, в противном случае он будет выполняться только в том случае, если вы возвращаете строку (или аналогичную ) и отобразится диалоговое окно, спрашивающее пользователя, хочет ли он наклониться или остаться на странице.

это невероятно глупая вещь, потому что onunload / onbeforeunload используются не только для запроса / предотвращения изменения страницы.

В моем случае я тоже использовал его, сохранив некоторые изменения, сделанные во время редактирования страницы, и я не хочу препятствовать пользователю изменять страницу (по крайней мере, Chrome должен уважать возвращаемое значение true или изменять страницу без запроса, если возврат не строка), ограничения времени выполнения скрипта будут приняты.

Это особенно раздражает в chrome, потому что событие onblur не отправляется элементам редактирования при выгрузке страницы, chrome просто игнорирует текущую страницу и переходит на другую. Таким образом, единственным изменением сохранения изменений был процесс выгрузки, и теперь это невозможно сделать без вопроса о STUPID, если пользователь хочет изменить его ... конечно, он хочет, а я не хотел этого предотвращать ...

надеюсь, что Chrome решит эту проблему более элегантно.

3 голосов
/ 30 сентября 2015

Попробуйте, у меня это сработало:

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};
2 голосов
/ 18 октября 2018

Вы должны попробовать это:

window.onbeforeunload = function(e) {
  e.returnValue = 'onbeforeunload';
  return 'onbeforeunload';
};

Это работает на последней версии Chrome.У нас была та же проблема, что e.returnValue со значением onbeforeunload решило мою проблему.

Ваш код должен быть таким:

    <head>
    <script>

    window.onbeforeunload = function(e) {
        e.returnValue = 'onbeforeunload';
        func();
        return ''onbeforeunload'';
    };

    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
    </head>
1 голос
/ 06 февраля 2011

Попробуй это.Я попробовал это, и это работает.Интересно, но сообщение Succes не нуждается в подтверждении, как и другое сообщение.

window.onbeforeunload = function() 
{
    if ( window.XMLHttpRequest )
    {
        console.log("before"); //alert("before");
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = function () {
            if ( request.readyState == 4 && request.status == 200 )
            {
                console.log("Succes!"); //alert("Succes!");
            }
        };
        request.send();
    }
}
0 голосов
/ 18 июля 2018

Я использую Chrome на MacOS High Sierra и у меня есть проект Angular 6, в котором я обрабатываю window.beforeunload window.onbeforeunload. Вы можете сделать это, это работает для меня:

handleUnload(event) {
  // Chrome
  event.returnValue = true;
}

При попытке вставить строку в event.returnValue выдается сообщение об ошибке. Требуется логическое значение.

0 голосов
/ 07 марта 2016

Текущие версии Chrome требуют установки свойства returnValue события. Простой возврат строки из обработчика событий не вызовет предупреждение.

addEventListener('beforeunload', function(event) {
  event.returnValue = 'You have unsaved changes.';
});
...