Ajax-запрос с JQuery на странице выгрузки - PullRequest
68 голосов
/ 30 ноября 2009

Я пытаюсь сделать это:

$(window).unload( function () { 

$.ajax({
    type: "POST",
    url: "http://localhost:8888/test.php?",
    data: "test",
    success: function(msg){
         alert( "Data Saved: " + msg );
    }
}); 
alert (c);
});

Однако предупреждение об успехе никогда не отображается, и этот запрос, похоже, даже не попадает на сервер. Что я делаю не так?

Ответы [ 6 ]

76 голосов
/ 30 ноября 2009

Я считаю, что вместо этого необходимо сделать запрос синхронным (по умолчанию он асинхронный) с использованием параметра async : false.

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

20 голосов
/ 30 ноября 2009

Попробуйте вызвать его с async = false;

jQuery.ajax({url:"http://localhost:8888/test.php?", async:false})

Я только что попробовал.

12 голосов
/ 19 мая 2015

Лучшее решение - использовать navigator.sendBeacon . Это совершенно новая функциональность, которая начинает реализовываться в новых версиях браузеров. Эта функция доступна в браузерах, более новых, чем Chrome 39 и Firefox 31. На момент написания этой статьи она не поддерживается Internet Explorer и Safari. Чтобы убедиться, что ваш запрос отправляется в браузерах, которые еще не поддерживают новые функции, вы можете использовать это решение:

var navigator.sendBeacon = navigator.sendBeacon || function (url, data) {
  var client = new XMLHttpRequest();
  client.open("POST", url, false); // third parameter indicates sync xhr
  client.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
  client.send(data);
};

Эта функция не позволяет регистрировать обратный вызов onsuccess, хотя.

3 голосов
/ 21 апреля 2015

В спецификации HTML 5 указано, что alert(), prompt() и т. Д. Будут недоступны во время события window.unload(). Пожалуйста, смотрите window.unload () для более подробной информации. Вы можете проверить результат, используя console.log('success'); вместо alert().

1 голос
/ 30 ноября 2009

Может быть, вы бы добились большего успеха, если бы вместо этого использовали событие onbeforeunload?

   $(window).bind('beforeunload', ...
0 голосов
/ 30 ноября 2009

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

error: function (xhr, textStatus) {
    alert('Server error: '+ textStatus);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...