我有一个GWT应用程序,当用户离开应用程序强制注销并删除任何数据等时,我想运行一些代码。
为此,我使用CloseHandler并使用Window.addCloseHandler进行注册。
我注意到单击刷新按钮时会运行onClose方法,但我无法将此事件与用户关闭浏览器的关闭区分开来。如果是刷新我不想进行注销等,我只想在用户关闭浏览器/标签或离开网站时执行此操作。
有人知道我该怎么做吗?
答案 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获得了一个带有相同最后一个标志的按摩,那么它只是一个刷新。 如果计时器结束,则断开连接...
这不是一个好的解决方案,但我认为很容易做到......如果有人有更好的解决方案......