GWT历史 - 为什么它会改变我的屏幕焦点?

时间:2013-08-07 07:44:05

标签: java gwt browser-history gwt-history

我有一个简单的应用程序结构,任何时候都会包含三个复合体 - 我的页眉,页脚和内容组合。复合材料按以下方式布置。

<body>
    <div id="header">
    <div id="content">
    <div id="footer">
</body>

复合材料被分配到<div>中的三个EntryPointEntryPoint还包含历史记录处理程序,如下所示。

History.addValueChangeHandler(new ValueChangeHandler<String>() {
    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        String historyToken = event.getValue();

        if(historyToken.isEmpty()) {
            parseTokens();
            ContentContainer.INSTANCE.setContent(new IndexScreen());
        }

        else if(historyToken.equalsIgnoreCase("registration")) {
            ContentContainer.INSTANCE.setContent(new RegisterScreen());
        }

        else if(historyToken.equalsIgnoreCase("login")) {
            ContentContainer.INSTANCE.setContent(new LoginScreen());
        }
    }
});

History.fireCurrentHistoryState();

在我的复合材料中,我有几个ClickEvent处理程序,看起来类似于以下内容。

@UiHandler("registerLink")
public void handleClick(ClickEvent event) {
    ContentContainer.INSTANCE.setContent(new RegisterScreen());
    History.newItem("registration", true);
}

这非常好地记录了历史。单击后退按钮时,它还会将我带到相应的页面。但是,将浏览器集中在内容合成上会产生非常奇怪的效果,浏览器的效果会滚动到底部。它不是一个交易破坏者,但它有点打破了用户体验。 (如果解释不清楚,请告诉我,我会添加图片)

究竟是什么造成了这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:0)

GWT历史令牌使用散列#令牌。在html中,如果一个元素的nameid带有#标记之后的字符串,那么最初的目的是使用浏览器专注于页面的特定部分。可能是您的id符合您的历史记录吗?

同样在你handleClick,你致电setContent。但是,如果我在触发更改事件后调用该调用,并且最终会调用onValueChange,这也会调用setContent。所以看起来你在这里召唤setContent两次。