Как заметно изменить css перед возвратом чего-либо в "window.onbeforeunload" - PullRequest
0 голосов
/ 31 августа 2011

Я хотел бы задать вопрос о window.onbeforeunload.

Я рассматриваю возможность появления элемента покрытия перед подтверждением, выгружать или нет. Но следующий код, кажется, не работает нормально. Элемент dom 'COVERALL' появляется сразу после подтверждения выгрузки.

window.onbeforeunload = function(event){

    $( COVERALL )
        .css('zIndex', 1000000)
        .fadeTo(1000, 1.0);

    ~~~~
    ~~~~
    some time-consuming tasks here
    ~~~~
    ~~~~

    return event.returnValue = "are you sure?";
}

1 Ответ

1 голос
/ 31 августа 2011

Правильный способ сделать это - использовать прослушиватель событий для захвата объекта события и затем предотвратить действие по умолчанию, которое должно быть оставлено.

window.addEventListener('beforeunload',
    function(e)
    {
        if (!confirm('Are you sure that you want to leave?'))
            e.preventDefault();
    }, 1);

Хотя его реализация может отличаться в разных браузерах.В моем Fiefox 6 он снова просит подтвердить один раз e.preventDefault ();инструкция достигнута, в качестве меры безопасности, осуществляемой Mozilla. 1 августа:

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

Сегодня я провел некоторое исследование по этому поводу и обнаружил, что, по-видимому, невозможно инициировать событие закрытия страницы из Javascript, поэтому использование настраиваемого поля подтверждения «HTML» для этого не будет возможным.Я пытался создавать собственные события, отправлять их различным элементам окна и даже проверять и копировать события, созданные браузером.(Все это в Firefox, в Chromium я не проверял, потому что отсутствие поддержки в Firefox означает, что никогда не полагаться на что-то подобное)

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

Я успешно смог добиться этого зав обоих браузерах со следующим кодом.

window.addEventListener('beforeunload',
function(e)
{
    var fd = new FormData();
    fd.append('html', document.body.innerHTML);
    var xhr = new XMLHttpRequest;
    xhr.open('POST', './dataRetriever.php');
    xhr.send(fd);
    // uncomment these if you want confirmation for all browsers
    // because this code will not ask for confirmation in others
    // than Mozilla powered ones.
    //if (!confirm('Leave?'))
    //  e.preventDefault();
}
, 1);

С этим я отправляю все тело innerHTML в мой скрипт dataRetriever.php, поэтому скажите мне, как он работает и работает ли он для вас, как ожидалось.

...