GWT обнаруживает обновление браузера в CloseHandler - PullRequest
3 голосов
/ 05 марта 2011

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

Для этого я использую CloseHandler и регистрирую его с помощью Window.addCloseHandler.

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

Кто-нибудь знает, как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 08 января 2013

Нет способа отличить «закрыть» от «обновить». Но вы можете установить cookie, который хранит время последнего вызова CloseHandler, и проверять при загрузке модуля, достаточно ли это время для очистки информации перед отображением страницы.

Вы можете сделать это с помощью следующего вспомогательного класса (BrowserCloseDetector). Вот пример использования его на onModuleLoad.

Тестовые линии :

@Override
public void onModuleLoad() {
    if (BrowserCloseDetector.get().wasClosed()) {
        GWT.log("Browser was closed.");
    }
    else {
        GWT.log("Refreshing or returning from another page.");
    }
}

Утилита класса :

import com.google.gwt.user.client.Cookies;
import com.google.gwt.user.client.Window;

public class BrowserCloseDetector {
    private static final String COOKIE = "detector";
    private static BrowserCloseDetector instance;

    private BrowserCloseDetector() {
        Window.addWindowClosingHandler(new Window.ClosingHandler() {
            public void onWindowClosing(Window.ClosingEvent closingEvent) {
                Cookies.setCookie(COOKIE, "");
            }
        });
    }

    public static BrowserCloseDetector get() {
        return (instance == null) ? instance = new BrowserCloseDetector() : instance;
    }

    public boolean wasClosed() {
        return Cookies.getCookie(COOKIE) == null;
    }
}
0 голосов
/ 30 марта 2011

Я тоже заинтересован, если у кого-то есть решение (только для GWT / java). Может быть, мы можем сделать это с помощью HistoryListerner? 1 Установите флажок для текущей страницы просмотра. 2 - когда происходит событие ClosingHandler, запускается «тайм-аут» на стороне сервера (например, 10 с) 3 - если за это время вы получили массаж от HistoryListerner с тем же последним флагом, так что это было просто обновление. отсоединения, если таймер истек ...

Не очень хорошее решение, но я думаю, что это легко сделать ... Если у кого-то есть лучшее ...

0 голосов
/ 07 марта 2011

Вы пробовали

в вашем hwml-файле хостинга / запуска gwt?

Я думаю, что если вы определили «хэш» карты (то есть псевдо-хэш javascript) в файле хостинга, а затем получили доступ к «хэшуmsgstr "в GWT через класс Dictionary вы можете обновлять значения в этом хеше по мере продвижения пользователя через приложение gwt.Это означает, что ваш стиль программирования потребовал бы, чтобы вы регистрировали вехи прогресса пользователя на этой карте.

Когда пользователь закрывает страницу браузера, запускается сценарий onunload запускающей HTML-страницы.Этот скрипт будет обращаться к карте, чтобы выяснить, что нужно обновить на сервере, или какой другой URL-адрес запустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...