在GWT中单击后退按钮时,不会触发ChangeValueHandler

时间:2012-07-23 21:18:17

标签: events gwt back

我有一个表单,我想在用户按下后退按钮时显示确认对话框。假设我有一个收听ChangeValueHandler的Texbonx

addValueChangeHandler(new ValueChangeHandler<String>() {    
    @Override
    public void onValueChange(ValueChangeEvent<String> event) {
        setChanged(true);
    }
}); 

这是短期方案

1)我在TextBox中输入文字

2)我按了后退按钮

3)ValueChangeEvent未被称为

我尝试使用BlurEvent在TextBox上以编程方式触发textBox.fireEvent(new BlurEvent() { });,但仍无结果。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

当页面关闭时(通过按后退按钮或关闭页面),控件不会触发任何事件。首先触发的是window.onbeforeunload,以便您有机会警告用户数据丢失并保留在页面上。如果用户选择留在页面上,那么应该触发的所有事件都将被触发(因此您的更改事件将被触发)。

您可以使用onbeforeunload

将处理程序附加到本机Window.addClosingHandler事件
Window.addWindowClosingHandler(new ClosingHandler() {

        @Override
        public void onWindowClosing( ClosingEvent event )
        {
            event.setMessage("If you leave the page now all data will be lost.");
        }

});

值得注意的是,ClosingEvent及其基础onbeforeunload事件在任何情况下都不能以编程方式取消。防止用户离开页面的唯一方法是用户自己在上面代码的弹出窗口中选择“Stay On This Page”。

答案 1 :(得分:0)

我所做的是将TextBox的焦点设置为False,然后检查它是否已更改,这会强制TextBox在单击后退按钮时不会聚焦。

这是检查表单是否已更改的代码

public boolean isChanged(){
    if(formPanel == null) return false;     
    for (int i = 0; i < formPanel.getWidgetCount(); i++) {
        if(formPanel.getWidget(i) instanceof BaseWidget){
            BaseWidget w= (BaseWidget) formPanel.getWidget(i);
            w.setFocus(false);
            if(w.isChanged()){
                return true;
            }
        }
    }
    return false;
}