在我的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;}
这可以警告用户不要离开。问题是我在每次相同页面回发时都收到警告。我的表单上有很多事情可能会触发回发:
这些都不应该引起警告,因为用户没有离开页面。我的代码尝试劫持addToPostBack(more details on that in this question)以在发回之前清除isDirty位,但是问题在于IE onbeforeunload
在__doPostBack之前触发,这显然是因为IE在单击链接时立即触发onbeforeunload(as described here) 。
当然,我可以连接每个控件以清除isDirty位,但是我更喜欢在表单级别上运行的解决方案,并且不需要我触摸可能触发回发的每个控件。
没有人能在ASP.NET中工作并且不涉及连接可能导致回发的每个控件的方法吗?
[我在Google上搜索有关在MVC中执行相同操作的解决方案时遇到了这篇文章。从Herb的上面改编的此解决方案似乎很好用。由于没有关于MVC的特定内容,因此它对于PHP,Classic ASP或使用HTML和JQuery的任何其他类型的应用程序同样适用。
var isDirty = false;
$(document).ready(function () {
$(':input').bind("change select keydown", setDirty);
$('form').submit(clearDirty);
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; }
有趣,但是...为什么不使用jQuery做所有事情?
您总是可以创建一个继承的页面类,该类具有一个自定义OnLoad
/ OnUnload
方法,该方法添加了立即执行的JavaScript。
通过基本跟踪鼠标位置使它起作用。请记住,您仍然可以获得Y值的正值(因此,我的<50行代码),但是只要您的提交按钮向下超过100像素,就可以了。
我也正在照顾这个,但是到目前为止我发现的是,使用所有html控件