Мне нужно захватить событие window.onbeforeunload

Я работаю над проектом, в котором мне нужно зафиксировать событие закрытия браузера (unload или beforeunload). Для этого я попробовал код ниже, но он не работает.

Код работает, только если я открываю окно консоли браузера (может быть, всего на секунду), но это необходимо, иначе он не работает.

Пример

$(window).on('beforeunload', function(e) {
 $.ajax({
    type: "POST",
    url: "url",
    data : {'value' : 1},
    dataType:'json'
 });
  return false;   
});

person Sunil Bamal    schedule 06.11.2019    source источник
comment
Вы правильно перехватываете событие, но обратите внимание, что логика, которую вы можете запустить под ним, чрезвычайно ограничена, так как браузер закрывается и не будет ждать много времени, прежде чем отменить какой-либо исполняемый скрипт. Что именно вы пытаетесь сделать в этом событии, и что из этого не работает?   -  person Rory McCrossan    schedule 06.11.2019
comment
вы правы @Rory, мне нужно записать какое-то значение в базу данных при закрытии браузера.   -  person Sunil Bamal    schedule 06.11.2019
comment
И я предполагаю, что вы используете для этого AJAX? Если да, отредактируйте вопрос, включив в него весь соответствующий код.   -  person Rory McCrossan    schedule 06.11.2019
comment
это простой пост ajax без синхронизации @RoryMcCrossan, я обновил вопрос.   -  person Sunil Bamal    schedule 06.11.2019
comment
Попробуйте использовать developer.mozilla.org/en-US/docs/Web/ API/Beacon_API. Запрос гарантированно будет отправлен. XHR отменяются, если они запущены из onbeforeunload   -  person Juan Mendes    schedule 06.11.2019


Ответы (1)


Beacon API предназначен специально для этого. Отправка запроса по мере выгрузки страницы. https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API

Запросы маяка используют метод HTTP POST, и запросы обычно не требуют ответа. Запросы гарантированно инициируются до того, как страница будет выгружена, и выполняются до завершения, не требуя запроса блокировки (например, XMLHttpRequest).

window.onunload = function analytics(event) {
  if (!navigator.sendBeacon) return;

  var url = "https://example.com/analytics";
  // Create the data to send
  var data = "state=" + event.type + "&location=" + location.href;

  // Send the beacon
  var status = navigator.sendBeacon(url, data);

  // Log the data and result
  console.log("sendBeacon: URL = ", url, "; data = ", data, "; status = ", status);
};
person Juan Mendes    schedule 06.11.2019