在我的 ASP.NET Web 应用程序中,我尝试使用 jQuery 创建一种通用方式,在用户进行更改后离开表单之前警告用户。相当标准的东西,但经过大量搜索后,我还没有找到一种有效的技术。
这是我目前所拥有的:
addToPostBack = function(func) {
var old__doPostBack = __doPostBack;
if (typeof __doPostBack != 'function') {
__doPostBack = func;
} else {
__doPostBack = function() {
old__doPostBack();
func();
}
}
}
var isDirty = false;
$(document).ready(function() {
addToPostBack(function() {
alert("Postback detected.")
clearDirty();
});
$(':input').bind("change select keydown", setDirty);
window.onbeforeunload = function(e) {
var msg = "You have unsaved changes. "
if (isDirty == true) {
var e = e || window.event;
if (e) { e.returnValue = msg; }
return msg;
}
};
});
setDirty = function() {isDirty = true;}
clearDirty = function() {isDirty = false;}
这可以警告用户不要离开。问题是我在每个同页回发时都会收到警告。我的表单上有很多东西可能会触发回发:
- 页面上有保存、取消和删除链接按钮
- 页面上可能有其他链接按钮执行服务器端功能,同时停留在同一页面上
- 可能还有其他带有 autopostback=true 的控件也附加了服务器端功能,但不会导致用户离开页面。
这些事情都不应该引起警告,因为用户没有离开页面。我的代码试图劫持 addToPostBack (有关此问题的更多详细信息)以在回发之前清除 isDirty 位,但问题是在 IEonbeforeunload
在 __doPostBack 之前触发,显然是因为 IE 在单击链接时立即触发 onbeforeunload (如此处所述)。
当然,我可以连接这些控件中的每一个以清除 isDirty 位,但我更喜欢在表单级别运行的解决方案,并且不需要我触摸每个可能触发回发的控件。
有没有人有一种适用于 ASP.NET 的方法,并且不涉及连接每个可能导致回发的控件?