Существуют

Как я могу увидеть, когда пользователь закрыл мою страницу (захват события window.close), а затем … не имеет большого значения (мне нужно отправить запрос AJAX, но могу ли я заставить его запустить оповещение Я могу сделать все остальное).

события javascript, но они не являются надежными для запроса Ajax (не гарантируется, что запрос, инициированный в одном из этих событий, достигнет сервера). unload и beforeunload Поэтому настоятельно рекомендуется делать это

, и вам следует искать альтернативу. не Если вам это определенно необходимо, рассмотрите решение в стиле «ping». Отправляйте запрос каждую минуту, в основном говоря серверу «Я все еще здесь». Затем, если сервер не получает такой запрос более двух минут (необходимо учитывать задержки и т. Д.), Клиент считается отключенным.

Другим решением было бы использовать


для выполнения запроса Sjax (синхронный JavaScript и XML), но это совершенно не рекомендуется. В результате этого браузер пользователя будет зависать до тех пор, пока запрос не будет завершен, что им не понравится (даже если запрос занимает мало времени). unload или beforeunload 1) Если вы ищете способ работы во всех браузерах, то самый безопасный способ — отправить синхронный AJAX на сервер. Это не очень хороший метод, но, по крайней мере, убедитесь, что вы не отправляете слишком много данных на сервер, и сервер работает быстро.

2) Вы также можете использовать асинхронный AJAX-запрос и использовать функцию

ignore_user_abort на сервере (если вы используете PHP). Однако во многом зависит от конфигурации сервера. Убедитесь, что вы проверяете это хорошо. на сервере (если вы используете PHP). Однако метод отправки данных на сервер асинхронно, без блокировки загрузки следующей страницы. Поскольку вы хотите отправить данные на сервер до того, как пользователь уйдет со страницы, вы можете использовать этот метод в обработчике событий

http://jsben.ch/ # / ARUtz navigator.sendBeacon unload . Там также, кажется, есть

$(window).on('unload', function() {
    var fd = new FormData();
    fd.append('ajax_data', 22);
    navigator.sendBeacon('ajax.php', fd);
});

Там также похоже на полифилл для sendBeacon . Он прибегает к отправке синхронного AJAX, если метод изначально не доступен.

ВАЖНО ДЛЯ МОБИЛЬНЫХ УСТРОЙСТВ: Обратите внимание, что обработчик событий . не обязательно запускается для мобильных телефонов . Но событие visibilitychange гарантированно сработает. Так что для мобильных устройств ваш код сбора данных может потребовать небольшой доработки.

Вы можете обратиться к моей статье в блоге для реализации кода всеми тремя способами.

Основываясь на этом другом ответе Глядя на вывод

Чтобы прояснить ситуацию, в 2018 году API-интерфейс Beacon является решением этой проблемы (в почти каждый браузер С чем вы столкнулись

Запросы Beacon гарантированно инициируются до страница выгружена, и они выполняются до конца, не требуя запроса на блокировку.

Вы можете использовать его внутри события onunload и быть уверенным, что он будет отправлен.

$(window).on('unload', function() {

    var URL = "https://example.com/foo";
    var data = "bar";

    navigator.sendBeacon(URL, data);

});

Отличная запись в блоге: http: / /usefulangle.com/post/62/javascript-send-data-to-server-on-page-exit-reload-redirect

API маяка: https://developer.mozilla.org/en-US / docs / Web / API / Beacon_API / Using_the_Beacon_API

Я также хотел добиться такой же функциональности & amp ; натолкнулся на этот ответ от Феликса ( не гарантируется, что запрос инициируется в одно из этих событий достигнет сервера ).

Чтобы сделать запрос доступным к серверу, мы попробовали следующий код: —

onbeforeunload = function() {

    //Your code goes here.

    return "";
} 

Мы используем браузер IE & amp ; сейчас, когда пользователь закрывает браузер, затем он получает диалог подтверждения, потому что return ""; & amp ; ожидает подтверждения пользователя ion & amp ; это время ожидания делает запрос на доступ к серверу.

Я согласен с идеей Феликса, и я решил свою проблему с этим решением, и теперь я хочу очистить решение на стороне сервера:

1.Отправить запрос со стороны клиента на сервер

2.Сохранить время последний запрос, полученный в переменной

3.проверьте время сервера и сравните его с переменной последнего полученного запроса

4.Если результат больше ожидаемого времени, начните выполнение кода, который вы хотите запустить, когда окна закрыты …

Выбранный ответ верен: вы не можете гарантировать, что браузер отправляет запрос xhr, но в зависимости от браузера вы можете надежно отправить запрос на вкладку или закрыть окно.

Обычно браузер закрывается до фактического выполнения xhr.send (). Chrome и ребро выглядят так, как будто они ждут, пока цикл событий javascript опустеет, прежде чем закрыть окно Они также запускают запрос xhr в другом потоке, нежели цикл событий javascript. Это означает, что если вы сможете поддерживать цикл событий достаточно долго, xhr будет успешно запущен. Например, я протестировал отправку запроса xhr, а затем подсчитал до 100 000 000. Это работало очень последовательно и в хроме и в крае для меня. Если вы используете angularjs, завершение вызова в $ http в $ apply делает то же самое.

onPropertyChange

Для потомков вот код, который я использовал, прикрепленный в качестве функции прослушивателя window.onbeforeunload:

  var xhr = new XMLHttpRequest();
  xhr.open("POST", <your url here>);
  xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
  var payload = {id: "123456789"};
  xhr.send(JSON.stringify(payload));

  for(var i = 0; i < 100000000; i  ) {}

Я тестировал в:

Chrome 61.0.3163.100

IE 11.608.15063.0CO

Edge 40.15063.0.0 { *} Он должен захватывать все, кроме закрытия программы браузера.

Use:

<body onUnload="javascript:">

javascript — функции стрелок и это — переполнение стека