我有一个页面,如果用户试图让页面保留未保存的数据,则应该发出警告。此对话框表示“您有未保存的数据。是否要保留?”
问题是,当用户单击要继续前进的链接时,表单值将变为空白,并显示对话框。我希望形成值以保持原位,以便用户实际上可以选择不继续,然后仍然离开输入到表单的内容。
现在代码的方式是它为表单是否有脏数据和隐藏变量保留一个标志:
<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;
}
我想这是我可以检查服务器端的变量并重新填充所有内容然后使用上面的技术和隐藏变量保存表单值的地方。
您认为这个想法是否奏效,或者您能提出替代解决方案吗?
答案 0 :(得分: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?');
}
};
然而,通过使用它,您将没有自己的“自定义”确认屏幕,将使用浏览器的内置确认(类似于堆栈溢出)。