在GWT中,当用户在导航确认对话框中点击“取消”时,如何重置URL?

4
在我的GWT应用程序中,当用户通过输入URL或关闭浏览器来导航离开当前应用程序时,我想要问用户确认。通常,这是通过注册ClosingHandler并在onWindowClosing方法中设置所需的对话框消息来完成的。这似乎效果很好。
然而,如果用户尝试导航到例如http://www.gmail.com(通过在URL栏中键入)并点击“取消”表示他不想导航,则我的应用程序仍在运行,但浏览器的URL栏仍然指示http://www.gmail.com。这会导致以后在我的应用程序中产生许多问题,并且如果用户将页面加为书签,则会得到错误的结果。
是否有一种方法可以在用户按下“取消”时自动重置URL?
或者,另一种选择是是否有一种方法可以检测到用户按下了“取消”按钮?如果是这样,是否有一种方法可以设置URL而不触发ValueChangeEvent?(我可以添加一些逻辑来防止这种情况,但如果存在内置机制,我宁愿使用它。)
3个回答

3

不确定这是否有效,但您尝试过以下代码吗:History.newItem(History.getToken(), false);以重置URL?它确实设置了历史令牌,而不会触发新的历史记录项。


谢谢!这个方法并不完全可行,但是通过存储上一个标记,我能够解决用户在应用程序内导航时的问题(因为在这种情况下,我知道用户何时按了取消)。现在,如果我能在onWindowClosing对话框之后知道什么就好了。也许可以用计时器?(呃!) - Philippe Beaudoin

1

我成功实现了这个功能。看起来GWT DeferredCommand是在确认窗口关闭后执行的。结合Hilbrand上面的答案,给了我正好想要的结果。以下是我所做的:

  public final void onWindowClosing(Window.ClosingEvent event) {
    event.setMessage(onLeaveQuestion);
    DeferredCommand.addCommand( new Command() {
      public void execute() {
        Window.Location.replace(currentLocation);
      }
    });
  }

其中currentLocation是通过每次历史令牌更改时调用Window.Location.getHref()来获取的。


经过一些实验,这可能会在Firefox或最新的Chrome中导致无限循环。详情请参见:http://code.google.com/p/gwt-platform/issues/detail?id=315 - Philippe Beaudoin

0

我通过创建自定义的PlaceController并替换URL中的令牌来解决了这个问题。虽然不是最理想的解决方案,但它可行!

如果(警告== null || Window.confirm(warning)){     where = newPlace;     eventBus.fireEvent(new PlaceChangeEvent(newPlace));     currentToken = History.getToken(); } else {     //当用户在确认弹出窗口中单击取消时,更新URL。     History.replaceItem(currentToken,false); }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接