【问题标题】:GWT MVP without tracking History / ignoring back button不跟踪历史记录/忽略后退按钮的 GWT MVP
【发布时间】:2023-03-31 23:01:01
【问题描述】:

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

有没有办法忽略或欺骗 GWT PlaceController / History manager 机制,以便当按下后退按钮时,它只停留在同一页面上? 我已经使用 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 以使用这个保存的地方,如果它与事件指定的不同。但我想我错过了一些微妙之处,因为它没有按预期工作。

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

【问题讨论】:

  • 点击后退按钮可以提示用户吗?
  • @Braj 不,这就是问题所在。我可以让它在用户单击后退按钮时提示用户。但我的业务伙伴宁愿它静静地留在当前的“页面”/GWT 屏幕上。我想要的是仅在调用 PlaceController.goTo(Place) 时导航并取消/忽略任何其他导航尝试。
  • 你试过History#ValueChangeHandler 我在帖子中建议的吗?
  • @Braj 我用 ValueChangeHandler 尝试了几种变体,但要么我的初始页面根本无法加载,要么它们没有帮助我留在同一页面上(因为 BACK 带你的页面to 是向前导航的一个例外,所以 BACK 仍然有效)。
  • 请您分享您的代码。

标签: gwt browser-history


【解决方案1】:

我已经在相同的上下文中发布了答案。

请查看以下链接:

尝试任何选项:

  • 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();

注意:添加对其他允许的历史令牌的检查。

【讨论】:

  • 注意:__gwt_historyFrame 仅在 IE6/IE7 中使用,即在 GWT 2.6 中不再需要它,默认为 user.agent,并且在 GWT 2.7 中将完全过时且无用。
  • 谢谢,但我已经阅读了三个链接中的两个,但这并不是我想要的。所有这些都会在用户返回时提示他们是否要离开页面。我的业务人员不想提示 - 他们只想忽略请求并保持在同一页面上。在另一个(基于 JSP 的)“站点”中,他们使用了以下内容://disable back button function noback(){ if (/*@cc_on @*//*@if (@_win32)!/*@end @*/false){;} else {window.onunload = function(){};} window.history.go(1); } noback(); 但我不确定如何将其转换为 GWT。
  • @Braj - 早上好,忘记在之前的评论中标记你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
相关资源
最近更新 更多