@vaddd
.NET junior developer

Как правильно выполнить запрос перед закртием/загрузкой другой страницы?

Перед переходом на другую страницу или когда пользователь принудительно закрывает вкладку браузера необходим передать на сервер некоторые данные. Отправку выполняю POST запросом.
В Chrom работает, хотя были случаи, когда этот запрос не выполнялся.
В Firefox запрос вообще не выполняется.
Сделал запрос синхоронным.
Работает везде.
Но правильно ли его выполнять синхронно?
Какие еще могут быть решения?
  • Вопрос задан
  • 246 просмотров
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
А других официальных вариантов и нет. Только синхронно.

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

Более правильно не выполнять запрос вообще. Вместо этого нужно записать куда-нибудь в куки или localStorage информацию, и при следующем посещении сайта отправлять её туда-сюда, сколько угодно раз. Если же нужно детектить именно само закрытие, то можно раз в N секунд делать ajax или другим способом поддерживать соединение, и по таймауту считать пользователя "отвалившимся".

Код, который может помочь
window.addEventListener("beforeunload", e => {
	if (is_test_passed) {
		return;
	}
	let message = "Вы уверены, что хотите закончить тест?";
	if (typeof e == "undefined") {
		e = window.event;
	}
	if (e) {
		e.returnValue = message;
	}
	return message;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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