1

我在 Web 表单页面上混合了 JQuery 和 Ajax 部分回发,我试图阻止用户在没有保存更改的情况下离开页面。

除非页面上的数据验证器之一无效,否则它工作得很好。提交按钮上有一个 jquery 方法,它基本上使 onbeforeunload 事件为空。如果验证器无效,我不希望发生这种情况,所以我关闭了客户端验证,并在方法中调用 Page.Validate(),然后如果页面无效,我尝试注册启动如此处所述脚本重置如下:

if (!Page.IsValid) {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "", "setConfirmUnload(true);", true);
            return;
        }

如果我运行点击提交并且页面无效,则会调用 setConfirmUnload(true),但找不到该方法(可能是因为每次回发时我都重新设置了它?

实际错误是“JavaScript 运行时错误:'setConfirmUnload' 未定义”,可能是因为 bindEvents() 尚未重新运行并因此创建了它?

我认为我的问题源于我使用部分回发和自动回发,在用户修改表单时设置数据。默认情况下,这会闪现我的 jquery,所以我重新绑定了 document.ready() 以及回发上的 jquery 调用,使用

<script type="text/javascript">
        // attach the event binding function to every partial update
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function (evt, args) {
            bindEvents();
        });
    </script>

我的 Bind Events 方法如下所示:

 function bindEvents() {

        // stuff removed for brevity here...


        $(function () {
            // Prevent accidental navigation away
            $(':input, select').bind(
                'change', function () { setConfirmUnload(true); });

            $('.noprompt-required').click(
                function () { setConfirmUnload(false); });

            function setConfirmUnload(on) {
                window.onbeforeunload = on ? unloadMessage : null;
            }
            function unloadMessage() {
                return ('You have entered new data on this page. ' +
                        'If you navigate away from this page without ' +
                        'first saving your data, the changes will be lost.');
            }

            window.onerror = UnspecifiedErrorHandler;
            function UnspecifiedErrorHandler() {
                return true;
            }

        });

    }        

如果是这种情况,有没有办法可以在 bindEvents() 调用发生后强制脚本运行?

4

0 回答 0