jQuery ajax вызов в обработчике onunload ПОСЛЕ ПОЛУЧЕНИЯ страницы при обновлении вручную. Как я могу гарантировать, что onunload произойдет первым? - PullRequest
3 голосов
/ 17 февраля 2011

У меня есть ситуация, когда на странице разгрузки я запускаю запрос на удаление черновика работы пользователя. Это работает нормально, пока пользователь не решит обновить страницу, после чего проверка вкладки сети Chrome показывает, что Chrome загружает новую страницу до того, как запрос ajax действительно будет запущен. В результате создается новый черновик при загрузке страницы, а затем сразу же удаляется вызов ajax. Вот в основном то, что я делаю:

window.onbeforeunload = function(){
    if (pageUpdated){
        return 'Are you sure you want to abandon this draft?';
    }
}

window.onunload = function(){
    $.ajax({
        async: false,
        type: 'DELETE',
        url: '/some/url/'
    });
}

Есть ли способ заставить обработчик onunload завершить работу перед отправкой запроса на новую страницу?

Браузеры протестированы: (Chrome 9, FF 3.6) в Ubuntu 10.04 Lucid

Ответы [ 4 ]

4 голосов
/ 12 августа 2011

В onbeforeunload или $ .unload () настройте свой объект AJAX с помощью async = false.Это обеспечит завершение вызова ajax до того, как страница будет выгружена.

Я знаю, что этому вопросу несколько месяцев, но я хотел бы добавить эту информацию на случай, если она поможет любому, кто ищет похожую проблему с AJAX!

3 голосов
/ 19 сентября 2012

Я здесь, чтобы подтвердить ответ @Silkster.Я могу запустить AJAX-запрос после установки опции async = false

. Вот пример кода.

3 голосов
/ 22 мая 2011

Синхронизация запроса XHR должна задержать загрузку новой страницы до завершения запроса.Я не знаю, как jQuery выполняет свои синхронные XHR-запросы под капотом, но вот как вы можете сделать это, используя простой JavaScript:

var request = new XMLHttpRequest();
// or new ActiveXObject("Microsoft.XMLHTTP") for some versions of IE
request.open("GET", "/some/url", false);
request.send(null);

var result = request.responseText;
alert(result);

Если поместить это в ваш обработчик выгрузки, браузер будет ждать, пока "/some / url "загружается перед переходом на следующую страницу.

1 голос
/ 17 февраля 2011

Вместо этого можно попробовать window.onbeforeunload, хотя я не уверен, реализовано ли это во всех браузерах.

...