0

如果用户试图离开包含未保存数据的页面,我有一个页面应该发出警告。此对话框的意思是“您有未保存的数据。您要继续吗?”

在此处输入图像描述

问题是当用户单击链接继续前进并显示对话框时,表单值变为空白。我希望将值保持在原位,以便用户实际上可以选择不继续,然后仍然将输入的内容留在表单中。

代码现在的方式是它为表单是否有脏数据保留一个标志,这是一个隐藏变量:

<input type="hidden" name="saveStatus" value="<%=saveStatus%>" />

onclick触摸表格用和设置这个隐藏变量onkeypressed

在服务器上,我有一些检查数据是否脏的逻辑:

public boolean returnToUnsavedData(ISessionHandler sessionHandler,
        Action action) {
    String saveStatus = sessionHandler.getRequestParameter("saveStatus");

    if (saveStatus != null && !saveStatus.trim().equals("")) {
        setHasUnsavedData(true);
    } else {
        setHasUnsavedData(false);
    }

    if (hasUnsavedData()) {
        if (!"menuHasUnsavedDataOk".equalsIgnoreCase(action
                .getActionCommand())
                && !action.getActionName().equals("Administrera")) {
            ResourceBundle messages = ResourceBundle.getBundle("messages");
            UserMessage um;
            if (action.getActionCommand().equals("fastsearch")) {

                um = new ExtendedUserMessage(
                        messages.getString("PV24"), UserMessage.TYPE_WARNING,
                        "Varning", action.getActionName(),
                        action.getActionCommand(), sessionHandler.getRequest().getParameter("fastsearch"));
            } else {
             um = new ExtendedUserMessage(
                    messages.getString("PV24"), UserMessage.TYPE_WARNING,
                    "Varning", action.getActionName(),
                    action.getActionCommand());
            }
            action.addUserMessage(um);
            action.setReturnPage(action.getCurrPage());
            setLatestActionTarget(action.getActionTarget());
            return true;
        } else {
            setHasUnsavedData(false);
        }
    }

    return false;
}

我想这是我可以检查服务器端的变量并重新填充所有内容的地方,然后使用像上面这样的技术和隐藏变量来保留表单值。

你认为这个想法会奏效还是你能提出替代解决方案?

4

1 回答 1

1

我认为您在这里不需要服务器端参与,您可以通过使用来实现这一点javascript

<input type="hidden" id="saveStatus" name="saveStatus" value="<%= saveStatus %>"/>

在页面被卸载之前注册一个观察者并saveStatus在那里检查你的变量:

window.onbeforeunload = function() { 
    if (document.getElementById('saveStatus').value) {
        return 'You have unsaved changes, are you sure you want to leave the page?'); 
    }
};

但是,通过使用它,您将没有自己的“自定义”确认屏幕,将使用浏览器的内置确认(类似于 stack-overflow)。

于 2012-10-03T09:24:11.073 回答