2011-03-05 31 views
3

刷新浏览器我有一个GWT应用程序,我希望当用户离开应用程序强行注销并删除任何数据等GWT检测是closeHandler

要做到这一点我使用的是closeHandler运行一些代码和使用Window.addCloseHandler注册它。

我注意到,当点击刷新按钮时,onClose方法会运行,但我一直无法区分这个事件和用户关闭浏览器的地方。如果是刷新,我不想做注销等,我只想在用户关闭浏览器/选项卡或从网站导航时执行此操作。

有人知道我该怎么做吗?

回答

0

你试过

< BODY onunload的= “脚本名”>

在你的GWT的托管/启动HTML文件?

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

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

0

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

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

1

没有办法区分'刷新''关闭'。但是,您可以设置保存最后一次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; 
    } 
}