GWT检测CloseHandler中的浏览器刷新

GWT检测CloseHandler中的浏览器刷新,gwt,refresh,Gwt,Refresh,我有一个GWT应用程序,我想在用户离开应用程序时运行一些代码,以强制注销并删除任何数据等 为此,我使用CloseHandler并使用Window.addCloseHandler注册它 我注意到,当单击“刷新”按钮时,onClose方法将运行,但我无法将此事件与用户关闭浏览器时的关闭区分开来。如果是刷新,我不想注销等,我只想在用户关闭浏览器/选项卡或离开站点时执行此操作 有人知道我怎么做吗?你试过了吗 在您的gwt托管/启动html文件中 我认为,如果您在宿主文件中定义了一个映射“散列”(即ja

我有一个GWT应用程序,我想在用户离开应用程序时运行一些代码,以强制注销并删除任何数据等

为此,我使用CloseHandler并使用Window.addCloseHandler注册它

我注意到,当单击“刷新”按钮时,onClose方法将运行,但我无法将此事件与用户关闭浏览器时的关闭区分开来。如果是刷新,我不想注销等,我只想在用户关闭浏览器/选项卡或离开站点时执行此操作

有人知道我怎么做吗?

你试过了吗

在您的gwt托管/启动html文件中

我认为,如果您在宿主文件中定义了一个映射“散列”(即javascript伪散列),然后通过Dictionary类访问GWT中的“散列”,则可以在用户通过GWT应用程序的过程中更新该散列中的值。这意味着,您的编程风格要求您将用户进度的里程碑记录在此地图上


当用户关闭浏览器页面时,将触发启动html页面的onunload脚本。该脚本将访问映射,以确定哪些内容需要更新到服务器,或者启动哪些其他url。

如果有人得到解决方案(仅限GWT/java端),我也很感兴趣。 也许我们可以和HistoryListerner一起做? 1-为当前查看页面设置标志。 2-当ClosingHandler事件发生时,在服务器端启动“超时”(例如10秒) 3-如果在这段时间内,你从HistoryListerner那里得到了一个带有相同最后标志的按摩,那么这只是一次刷新。 如果计时器已过,则断开连接


这不是一个好的解决方案,但我认为这很容易做到。。。如果有人有更好的…

没有办法区分“关闭”和“刷新”。但是,您可以设置保存上次CloseHandler调用时间的cookie,并在加载模块时检查该时间是否足够长,以便在显示页面之前清除信息

您可以使用下面的实用程序类(
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;
    }
}
实用程序类

@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;
    }
}