Не успел отправить запрос на выгрузку окна - PullRequest
1 голос
/ 11 февраля 2012

Я хочу уведомить сервер о том, что пользователь закрывает окно браузера.

Я перепробовал все

$(window).bind("beforeunload", function() {
    $.get("${contextPath}/notify?direction=logout");
});

и

$(window).unload( function() {
    $.get("${contextPath}/notify?direction=logout");
});

и

$(window).unload(function() {
    $.ajax({
      url: "${contextPath}/notify?direction=logout"
    });
});

, но ни тот, ни другой не работают, несмотря на то, что в руководстве сказано, что это, вероятно, должно.

В Firefox у меня нет уведомлений только о закрытии окна, но есть уведомления об обновлении страницы.В Chrome у меня нет ни одного.

Я попытался отследить этот скрипт в Firebug или Chrome Developer Tools и обнаружил, что он начинает работать, если его отследить!Поэтому я думаю, что он не работает нормально, потому что у него нет времени на отправку запроса до закрытия окна или навигации.

Это правда?Как выполнить мою задачу?

РЕШЕНИЕ

Это сработало:

$(window).bind("beforeunload",
    function() {
        $.ajax({
            async: false,
            url: 'notify'
        });
    }
);

Ответы [ 5 ]

4 голосов
/ 11 февраля 2012

Это очень сложно, потому что браузер не будет ждать, пока не придет ответ, поэтому запрос ajax может быть прерван.

Вы можете попробовать что-то подобное в событии beforeunload.

$(window).bind("beforeunload", function() {
    $.ajax({
        async: false,//This will make sure the browser waits until request completes
        url: "${contextPath}/notify?direction=logout"
    });
});
2 голосов
/ 25 июня 2018

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

Лучшее решение - использовать navigator.sendBeacon: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon

window.addEventListener("unload", logData, false);

function logData() {
  navigator.sendBeacon("/log", analyticsData);
}

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

Для решения этой проблемы аналитикаи диагностический код исторически выполнял синхронный вызов XMLHttpRequest в обработчике событий unload или beforeunload для отправки данных.Синхронный XMLHttpRequest блокирует процесс выгрузки документа, что, в свою очередь, приводит к замедлению следующей навигации.Следующая страница ничего не может сделать, чтобы избежать этого восприятия низкой производительности загрузки страницы, и в результате пользователь чувствует, что новая веб-страница загружается медленно, даже если настоящая проблема связана с предыдущей страницей.

1 голос
/ 11 февраля 2012

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

Если вам не терпится узнать, когда пользователь покидает ваш домен, используйте опросы или веб-сокеты с запасным вариантом.

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

Кроме того, он «начинает» работать во время трассировки, потому что событие запускается еще до того, как начинает загружаться следующая страница. Это было давно, но в прошлый раз я играл с этими событиями, но некоторые браузеры могут выполнять код в течение некоторого времени, пока загружается следующая страница.

0 голосов
/ 11 февраля 2012

Я не хочу говорить это как комментарий, потому что я работал над этим Сценарий давно. Я бы сохранил всю информацию на сервер когда конечный пользователь случайно или намеренно закрывает браузер. я скажу вам .. Это работало отлично.,

Я сказал, что отлично работает, верно? Ну, это было только с Firefox и IE. Это не удалось во многих других браузерах (например, Opera, Safari).

Так что мой добрый совет не полагаться на эти функции, так как они только для браузера.

0 голосов
/ 11 февраля 2012

Вам не повезло, пользователь не мог бы выйти из страницы, если JavaScript, выполняемый при выгрузке страницы, блокировался.

Представьте себе весь спам.

В некоторыхВ браузерах событие unload сработает, но между вашим сценарием и очисткой страницы возникнет гонка.

Спасибо

...