如何捕获用户离开页面并取消它

时间:2010-02-03 15:35:39

标签: gwt

当用户离开GWT应用程序时,我想打开一个确认对话框并为他们提供留下的选择,即确认(“你确定要离开这个页面”,“是”,“否”)

我知道如何构建拨号盒。 :)

问题是,如何捕获用户离开页面的事件以及如何取消它?

丹尼尔

3 个答案:

答案 0 :(得分:16)

调用Window.addWindowClosingHandler,并在Window.ClosingEvent上传递一个调用setMessage的回调,如下所示:

Window.addWindowClosingHandler(new Window.ClosingHandler() {
      public void onWindowClosing(Window.ClosingEvent closingEvent) {
        closingEvent.setMessage("Do you really want to leave the page?");
      }
    });

(我已经添加了GWT 2.0文档的链接;在这些URL中将2.0更改为1.6以查看GWT 1.6 / 1.7文档。)

请注意,这样做,您不必自己创建对话框。

答案 1 :(得分:4)

您必须创建一个CloseHandler并在Window上注册它:

Window.addWindowClosingHandler(handler)

编辑:固定方法名称。请参阅评论和回答。

答案 2 :(得分:2)

onModuleLoad()

中调用以下方法
 private void setupHistory() {
        final String initToken = History.getToken();
        if (initToken.length() == 0) {
            History.newItem("main");
        }

        // Add history listener
        HandlerRegistration historyHandlerRegistration = History.addValueChangeHandler(new ValueChangeHandler() {
            @Override
            public void onValueChange(ValueChangeEvent event) {
                String token = event.getValue();
                if (initToken.equals(token)) {
                    History.newItem(initToken);
                }
            }
        });

        // Now that we've setup our listener, fire the initial history state.
        History.fireCurrentHistoryState();

        Window.addWindowClosingHandler(new ClosingHandler() {
            boolean reloading = false;

            @Override
            public void onWindowClosing(ClosingEvent event) {
                if (!reloading) {
                    String userAgent = Window.Navigator.getUserAgent();
                    if (userAgent.contains("MSIE")) {
                        if (!Window.confirm("Do you really want to exit?")) {
                            reloading = true;
                            Window.Location.reload(); // For IE
                        }
                    }
                    else {
                        event.setMessage("My App"); // For other browser
                    }
                }
            }
        });
    }