首先,在火焰开始之前,我确实知道试图阻止浏览器中的后退按钮是一个愚蠢的想法。我不会尝试这样做,但我的商业伙伴非常坚持。我们正在将现有的.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
答案 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();
注意:添加其他允许的历史记录代码检查。