如果你正在谈论ASP.NET AJAX部分回发,那么我今天也遇到了这种行为,做同样的事情。 (如果你没有,完全无视我的职务。)
在到目前为止我的经验,这似乎是,如果你的部分回发是由输入触发,它不会在局部回传时触发onbeforeunload ,但是如果部分回发是由超链接触发的,它会。看起来浏览器假设你正在导航,如果你点击锚标签中的任何东西(只在IE和FireFox中测试,但是是)。
页面是否有一个隐藏的字段已经是我用来确定客户端,当它适合显示导航离开警告,所以我能够解决这个很简单,通过添加一个检查隐藏字段的值给我的onbeforeunload的if条件,并挂接到PageRequestManager的BeginRequest和EndRequest处理程序来设置值。这有效地禁用部分回发期间的警告。如果你想检查更多具体的东西,你可以在这里添加更复杂的逻辑。
这是一个真正过分简化的代码示例。 (对不起,如果我回吐和审查到它不工作,但它应该给你一个想法点)
window.onbeforeunload = checkNavigateAway;
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(onBeginRequest);
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(onEndRequest);
function onBeginRequest(sender, args) {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "false";
}
}
function onEndRequest(sender, args) {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0) {
navigateAwayFlag[0].value = "true";
}
}
function checkNavigateAway() {
var navigateAwayFlag = $("input[id*='navigateAwayValue']");
if (navigateAwayFlag.length > 0 && navigateAwayFlag[0].value == "true")
{
return "Warning Text";
}
}
编辑:坏消息。以上似乎不适用于IE6。它似乎是以不同于Firefox的顺序触发事件,因此onbeforeunload在AJAX beginRequest之前触发...可能必须找到一种方法,在onbeforeunload触发之前通过超链接单击更改标志值。
感谢。阅读规范,它引用“调用”下的“document.write”。这当然与我们使用的网格库有关。 – Paul 2009-02-11 20:21:05