ASP.NET,jQuery,脏表单和window.onbeforeunload

问题描述 投票:12回答:5

在我的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;}

这可以警告用户不要离开。问题是我在每次相同页面回发时都收到警告。我的表单上有很多事情可能会触发回发:

  1. 页面上有保存,取消和删除链接按钮
  2. 页面上可能还有其他链接按钮在保持同一页面的同时执行服务器端功能
  3. [可能还有其他带有autopostback = true的控件,它们也附加有服务器端功能,但不会导致用户离开页面。

这些都不应该引起警告,因为用户没有离开页面。我的代码尝试劫持addToPostBack(more details on that in this question)以在发回之前清除isDirty位,但是问题在于IE onbeforeunload在__doPostBack之前触发,这显然是因为IE在单击链接时立即触发onb​​eforeunload(as described here) 。

当然,我可以连接每个控件以清除isDirty位,但是我更喜欢在表单级别上运行的解决方案,并且不需要我触摸可能触发回发的每个控件。

没有人能在ASP.NET中工作并且不涉及连接可能导致回发的每个控件的方法吗?

asp.net jquery onbeforeunload
5个回答
8
投票

[我在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; }

2
投票

有趣,但是...为什么不使用jQuery做所有事情?


2
投票

您总是可以创建一个继承的页面类,该类具有一个自定义OnLoad / OnUnload方法,该方法添加了立即执行的JavaScript。


1
投票

通过基本跟踪鼠标位置使它起作用。请记住,您仍然可以获得Y值的正值(因此,我的<50行代码),但是只要您的提交按钮向下超过100像素,就可以了。


0
投票

我也正在照顾这个,但是到目前为止我发现的是,使用所有html控件

© www.soinside.com 2019 - 2024. All rights reserved.