JavaScript: ожидайте до ajax концы запроса для закрытия страницы [дубликат]

11
задан maxdj 4 June 2010 в 00:39
поделиться

2 ответа

Редактировать На основании вашего комментария ниже, измененный ответ:

Если вы хотите заблокировать, пока не завершится ранее инициированный запрос , вы можете это сделать вот так:

window.onbeforeunload = function(event) {
    var s;
    event = event || window.event;
    if (requestsPending > 0) {
        s = "Your most recent changes are still being saved. " +
            "If you close the window now, they may not be saved.";
        event.returnValue = s;
        return s;
    }
}

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

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

Подробнее о запросе пользователя, отменять ли события закрытия здесь и здесь .


Старый ответ :

В идеале, если возможно, вы хотите, чтобы не делал этого .: -)

Если вы не можете этого избежать, можно сделать запрос Ajax синхронным , чтобы он блокировал процесс onbeforeunload до его завершения. Я не знаю DWR, но полагаю, что у него есть флаг, позволяющий контролировать, является ли запрос синхронным или нет. В исходном API XmlHTTPRequest это третий параметр для open :

req.open('GET', 'http://www.mozilla.org/', false);
                                            ^ false = synchronous

Большинство библиотек будут иметь эквивалент. Например, в Prototype в параметрах стоит флаг asynchronous: false .

Но опять же, если бы вы могли избежать запуска запросов Ajax как части выгрузки страницы, я бы это сделал. Будет заметная задержка, пока запрос будет установлен, передан и завершен. Гораздо лучше, чтобы сервер использовал тайм-аут, чтобы закрыть все, что вы пытаетесь закрыть с помощью этого. (Это может быть довольно короткий тайм-аут; вы можете поддерживать сеанс в рабочем состоянии, используя асинхронные Ajax-запросы периодически на странице, пока она открыта - скажем, один раз в минуту и ​​тайм-аут через две минуты.)

12
ответ дан 3 December 2019 в 07:36
поделиться

Короче говоря, вы не можете (и не должны) этого делать. Если пользователь закрывает браузер, он закрывается... никакие события в стиле unload не гарантируют завершения, а что-то, делающее AJAX с задержкой, еще более маловероятно, что завершится.

Вам следует рассмотреть возможность запуска событий в другой точке или вообще изменить подход, но вызов AJAX в событии unload будет ненадежным, в лучшем случае.

В качестве дополнения к вышесказанному о не следует части, подумайте об этом так: сколько вкладок у вас обычно открыто в каждом конкретном окне? У меня обычно открыто 4-6 окон хрома с 5-12 вкладками в каждом... должно ли окно моего браузера зависать открытым, потому что одна из этих вкладок хочет сделать какой-то AJAX-запрос, о котором я не забочусь? Я бы не хотел этого как пользователь, поэтому я бы не пытался сделать это как разработчик. Это, конечно, всего лишь мнение, но пища для размышлений.

4
ответ дан 3 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: