没有跟踪历史/忽略后退按钮的GWT MVP

时间:2014-04-27 18:09:52

标签: gwt browser-history

首先,在火焰开始之前,我确实知道试图阻止浏览器中的后退按钮是一个愚蠢的想法。我不会尝试这样做,但我的商业伙伴非常坚持。我们正在将现有的.exe移植到网络上,他们对此的定义是在浏览器中运行它。而不是#34;使它成为一个网站"。所以,事实上这是一个坏主意(我同意),这就是问题所在:

有没有办法忽略或欺骗GWT PlaceController / History管理器机制,以便当按下后退按钮时,它只是停留在同一页面上? 我已经使用Window.addWindowClosingHandler添加一个处理程序,它将提示用户是否要离开页面并覆盖defaultHistorian的newItem()方法,以便根本不跟踪历史记录,但这不是什么商界人士想要的。

他们想要的只是忽略后退按钮,以便在点击时不会发生任何事情。 如果有人知道如何用GWT做到这一点,我将非常感激。

我已经做了很多谷歌搜索,并且没有发现任何与此问题完全相同的内容。至少,不够接近帮助。

我能够让GWT不累积任何历史记录,这样当用户按下BACK按钮时,它们会导致onWindowClosing事件发生,浏览器会提示他们是否要留下或离开。这将实现不允许BACK按钮取回它们的目标,但它有点严厉。这段代码可以做到:

class TvHistorian extends PlaceHistoryHandler.DefaultHistorian
{
  @Override
  public void newItem(String token, boolean issueEvent) {
    // don't do anything - this will prevent history from accumulating
  }
}

final PlaceHistoryHandler historyHandler = new PlaceHistoryHandler(historyMapper, new TvHistorian());

我尝试了很多东西,包括扩展PlaceController.goTo()以保存" lastNormalFlowPlace"。然后,我尝试覆盖History.onValueChange以使用此保存的Place,如果它与指定的事件不同。但我认为我错过了一些微妙之处,因为它没有按预期工作。

由于上述异常,我的代码看起来几乎与此处记录的内容完全相同:http://www.gwtproject.org/doc/latest/DevGuideMvpActivitiesAndPlaces.html#Putting_it_all_together

1 个答案:

答案 0 :(得分:0)

我已在相同的背景下发布了答案。

请看下面的链接:

尝试任何选项:

  • History.addValueChangeHandler
  • WindowClosingHandler
  • Event.addNativePreviewHandler
  • $wnd.onbeforeunload

- 编辑 -

示例代码:(它在Firefox,Chrome以及IE9中运行良好

注意:在onModuleLoad()方法的开头添加以下代码。

    final String initToken = "Place";

    History.addValueChangeHandler(new ValueChangeHandler<String>() {

        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            String token = event.getValue();
            if (!initToken.equalsIgnoreCase(token)) {
                History.newItem(initToken);
            }
        }
    });

    // fire the initial history state.
    History.fireCurrentHistoryState();

注意:添加其他允许的历史记录代码检查。