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

问题是,当用户单击一个链接继续移动时,表单值变为空白,并显示该对话框。我希望表单中的值保持不变,这样用户实际上可以选择不继续,然后仍然保留输入到表单中的内容。
代码现在的方式是,它保留了一个标记,用于指示表单是否有脏数据,这是一个隐藏变量:
<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;
}我想这就是我可以在服务器端检查变量并重新填充所有内容的地方,然后使用类似上面的技术与隐藏变量一起保存表单值。
你认为这个想法会行得通吗?或者你能提出替代的解决方案吗?
发布于 2012-10-03 17:24:11
我认为这里不需要服务器端的参与,只需使用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?');
}
};然而,通过使用这个,你将不会有你自己的‘自定义’确认屏幕,将使用浏览器的内置确认(类似于堆栈溢出)。
https://stackoverflow.com/questions/12703834
复制相似问题