GWT检测CloseHandler中的浏览器刷新

时间:2011-03-05 12:38:21

标签: gwt refresh

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

为此,我使用CloseHandler并使用Window.addCloseHandler进行注册。

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

有人知道我该怎么做吗?

3 个答案:

答案 0 :(得分:1)

无法将'close'与'refresh'区分开来。但是,您可以设置一个包含最后一次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;
    }
}

答案 1 :(得分:0)

你试过吗

< BODY onUnload =“scriptname”>

在你的gwt主机/启动html文件中?

我在想如果你在托管文件中定义了一个地图“hash”(即一个javascript伪哈希),然后通过Dictionary类访问GWT中的“hash”,你可以随着用户的进展更新该哈希中的值通过gwt应用程序。这意味着,您的编程风格将要求您将用户进度的里程碑记录到此地图上。

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

答案 2 :(得分:0)

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

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