2012-02-10 3 views
1

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

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

$(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' 
     }); 
    } 
); 
+0

Первая мысль: AJAX - неправильный инструмент для работы. Вы должны использовать SJAX (синхронно), AJAX по определению освобождает поток графического интерфейса, чтобы продолжить обработку [в этом случае выгрузить]. – Shad

+0

Отметьте этот ответ: http://stackoverflow.com/a/9234785/252780 –

ответ

3

Это очень сложно, потому что браузер не будет ждать до тех пор пока ответ приходит так Аякс запрос может получить прерван.

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

$(window).bind("beforeunload", function() { 
    $.ajax({ 
     async: false,//This will make sure the browser waits until request completes 
     url: "${contextPath}/notify?direction=logout" 
    }); 
}); 
+0

Это ненадежно, и пока вы можете «попробовать», и он может работать, он никогда не должен использоваться в производственной среде. –

0

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

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

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

Благодаря

0

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

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

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

1

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

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

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

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

+0

Надежность 100% в порядке для моей задачи, потому что у меня есть резервные решения, как вы сказали. Проблема с периодическим опросом заключается в том, что это не работает быстро. Поэтому мне нужно быстрое решение, которое работает с некоторыми браузерами. – Dims