Мне нужно убедиться, что когда кто-то перезагружает или закрывает мою страницу, их прогресс сохраняется. Чтобы сохранить прогресс, я делаю POST
через XMLHttpRequest()
, отправляя данные на сервер. Я запускаю эту функцию saveData()
внутри события window.onbeforeunload
.
Проблема в том, что saveData()
выполняет некоторые вычисления, а затем вызывает sendData(content)
, чтобы, наконец, фактически отправить данные. И если данные, которые я обрабатываю и отправляю, велики (> 100 КБ), окно, кажется, закрывается до того, как все данные попадут на сервер. (Я отправляю изображение, и иногда я получаю только половину на другой стороне)
HTTP-запрос является синхронным, xhr.open("POST", url, false)
, но, похоже, это не работает.
Итак, мой вопрос: как я могу предотвратить завершение функции onbeforeunload, ДО xhr.readyState == 4
? Как заставить его ждать этого события?
Ох, и setTimeout()
не получится. Окно закроется до того, как наступит «Время».
Это не сработает:
if (!jQuery) {
setTimeout(attachCode, 100);
return;
} else {
// continue and close
}
Спасибо за любое понимание!
PS: это не должно быть «плохой практикой», так как это занимает всего несколько секунд, и я не хочу, чтобы пользователю приходилось сохранять вручную. Кроме того, сохранение, пока он работает (например, до того, как он закроет окно), замедлит работу приложения, поэтому я не могу этого сделать.
[EDIT] В качестве временной меры я прибегнул к использованию этот трюк для автоматического сохранения данных, если пользователь решит остаться на странице. Однако мне бы очень хотелось, чтобы не нужно было использовать какие-либо предупреждающие сообщения. :(