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

    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;
    }
    Ответ написан
    7 комментариев