我在 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() 调用发生后强制脚本运行?