AJAX звонит непосредственно перед тем, как покинуть страницу - PullRequest
7 голосов
/ 07 февраля 2011

Я хочу выполнить простой запрос получения AJAX, когда пользователь нажимает ссылку на другую страницу. Будет ли завершен вызов AJAX или он остановится, потому что пользователь покидает страницу, которая инициировала запрос AJAX? Меня не волнует ответ на запрос get.

Есть мысли или идеи?

Ответы [ 2 ]

12 голосов
/ 07 февраля 2011

Если вы просто хотите отправить данные на ваш сервер и не беспокоиться о резонансе, вы можете попробовать запрос маяк . Это в основном, огонь и забыл вещь, которая работает так:

function sendInfo(something) {
     var beacon = new Image();
         beacon.src = '/somepath/script.pl?info=' + something;
}

$('a[href^=http]').bind('click', function(e) {
    sendInfo(escape(e.href));
});

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

$('a[href^=http]').bind('click', function(e) {
    $.get('/somepath/script.pl', {info: escape(e.href)}, function(data) {
        location.href = e.href;
    });

    return false;
});
3 голосов
/ 20 июня 2012

Я знаю, что этот вопрос задавали, отвечали и принимали давным-давно ... но я только недавно задал себе тот же вопрос, нашел ответ jAndy и немного улучшил его (относительно проблемы совместимости Chrome) и подумалЯ бы опубликовал свои выводы.

Ответ маяка Энди был приятным и простым, но, как упомянул SirDarius, кажется, что Chrome оптимизирован, чтобы игнорировать его.

Я изменил код jAndy следующим образом:

function sendInfo(something) {
     var beacon = new Image();
         beacon.src = '/somepath/script.pl?info=' + something;
}

$('a[href^=http]').bind('click', function(e) {
    sendInfo(escape(e.href));
    setTimeout(function() {window.location.href=e.href;},0); // change window location on timeout
    return false; // cancel current window location change
});

и это, похоже, избавило от проблемы.

Спасибо, Энди!

...