在我的ASP.NET网络应用程序中,我尝试创建一种通用的方式来警告用户,在使用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;}
只要警告用户不要离开就行了.问题是我在每个相同的页面回发上收到警告.我的表单上有许多可能会触发回发的内容:
>页面上有保存,取消和删除链接按钮
>页面上可能还有其他的linkbutton在同一页面上执行服务器端功能
>可能还有其他的控件,autopostback = true,它们也附有服务器端功能,但不会导致用户离开页面.
这些东西都不应该引起警告,因为用户没有离开页面.我的代码试图劫持addToPostBack(more details on that in this question)在发布之前清除isDirty位,但问题是在IE onbeforeunload在__doPostBack之前触发,显然是因为当点击链接时,IE会立即触发onbeforeunload(as described here).
当然,我可以连接每个这些控件以清除isDirty位,但是我更喜欢在表单级别上运行的解决方案,并且不需要我触摸可能触发回发的每个控件.
有没有人有一种在ASP.NET中工作的方法,并且不涉及每个可能导致回发的控件的布线?
解决方法
我碰到这个帖子,而谷歌在一个解决方案做同样的事情在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; }