情况:我有一个包含两个表格的Grails网页。一个表显示人员信息(包括某些标志),第二个表有一个带有“添加按钮”的标志列表,允许用户向自己添加一个给定的标志。
现在,有一个保存按钮,当单击时,将用户标志的当前“状态”推送到我们的数据库。因此,如果在用户尝试导航到站点的其他部分时显示未保存的信息,我希望能够显示提示。通过使用每个标志存储的现有isDirty布尔值,这很容易。我可以循环遍历人员活动标志并检查它是否脏。如果此人包含至少1个脏标志,我需要在他们试图离开时显示提示,因为除非明确点击该按钮,否则不会保存该数据。
问题:有很多方法可以离开此页面。我在用
<body onbeforeunload="checkForDirtyFlags();">
,其中checkForDirtyFlags()是用于检查任何脏标志的基本js函数。但事情就是这样 - 当用户添加或删除标志时,会导致页面重新加载,因为页面的设置方式是重定向到这样的URL:
"http://my.url/addFlag/123456"
然后控制器知道将ID为123456的标志添加到当前人员。但是,这不会改变人在网站中的位置,因为仍然会呈现相同的页面(它只包含更新的表)。所以基本上,当我看到一个带有addFlag或removeFlag的URL时,我不想提示用户他们是否确定要离开页面,因为在用户眼中他们不会离开页面。
问题:有没有办法确定onbeforeunload
期间目标是什么?所以我可以在我的javascript中使用这样的东西:
function checkForDirtyFlag() {
if( justAdding ) { //We are just adding a flag. No prompt necessary
//Don't do anything
}
else if( justRemoving ) { //We are just removing a flag. No prompt necessary
//Don't do anything
}
else { // In this case, we want to prompt them to save before leaving
alert('You have unsaved data on the page. Leaving now will lose that data. Are you sure you want to leave?');
}
}
如果其中任何一项不明确,请告诉我,我会尝试清除它。
谢谢!
答案 0 :(得分:0)
为什么不立即将更改推送到数据库,而不必按下保存按钮,或将它们存储在临时数据库中,以便在导航到其他部分时不会丢失未保存的更改现场。
答案 1 :(得分:0)
我不太确定我是否帮助你 - 但你实际上已经在那里写了解决方案。为什么不在必要时return
内onbeforeunload
发送字符串消息?
例如:
window.onbeforeunload = function() {
if( justAdding ) { //We are just adding a flag. No prompt necessary
//Don't do anything
}
else if( justRemoving ) { //We are just removing a flag. No prompt necessary
//Don't do anything
}
else { // In this case, we want to prompt them to save before leaving
return 'You have unsaved data on the page. Leaving now will lose that data. Are you sure you want to leave?';
}
};
如果从该事件返回string value
,浏览器将处理显示的模式对话框窗口。否则没有任何反应。
答案 2 :(得分:0)
我认为您无法在卸载事件中获取目标位置。我要做的是将保存/提交按钮绑定到一个功能,如果按下按钮,该功能将禁用卸载事件,因此禁用提示。如果用户试图通过按回等离开,则会解除卸载事件。