Ответ 1
Я считаю, что вам нужно сделать запрос синхронным (по умолчанию он асинхронным) с помощью параметра async : false
.
Я пытаюсь сделать это:
$(window).unload( function () {
$.ajax({
type: "POST",
url: "http://localhost:8888/test.php?",
data: "test",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
alert (c);
});
Однако предупреждение об успешном завершении никогда не отображается, и этот запрос, похоже, даже не поражает сервер. Что я делаю неправильно?
Я считаю, что вам нужно сделать запрос синхронным (по умолчанию он асинхронным) с помощью параметра async : false
.
Попробуйте вызвать его с помощью async = false;
jQuery.ajax({url:"http://localhost:8888/test.php?", async:false})
Я просто попробовал.
Лучшее решение - использовать 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.
В спецификации HTML 5 указано, что alert()
, prompt()
и т.д. не будут доступны во время события window.unload()
. Подробнее см. window.unload(). Вы можете проверить результат, используя console.log('success');
вместо alert()
.
Ваша функция и вызов Ajax выглядят прекрасно, поэтому я предполагаю, что ваше окно браузера закрыто до того, как вызов ajax успеет перейти на сервер и обратно. Вызов ajax может вернуть что-то, когда окно закрывается, попробуйте добавить функцию ошибки к вашему вызову ajax, чтобы узнать, есть ли этот случай:
error: function (xhr, textStatus) {
alert('Server error: '+ textStatus);
}
Может быть, у вас будет больше успеха с помощью события onbeforeunload
?
$(window).bind('beforeunload', ...