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

Her*_*ill 12 asp.net jquery onbeforeunload

在我的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;}
Run Code Online (Sandbox Code Playgroud)

这可以起到警告用户导航的作用.问题是我在每个同页的回发中收到警告.我的表单上有很多东西可能会触发回发:

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

这些都不会引发警告,因为用户不会离开页面.我的代码试图劫持addToPostBack(在这个问题中有更多细节)在发回之前清除isDirty位,但问题是在IE onbeforeunload之前发生__doPostBack,显然是因为IE在点击链接时立即触发onb​​eforeunload(如此处所述)).

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

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

Kev*_*ley 8

我在Googling寻找解决方案在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; }
Run Code Online (Sandbox Code Playgroud)


Jon*_*han 2

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

然后,您不必在特定于控件的级别处理它,而是在表单/页面级别处理它。