2009-02-11 50 views
21

我有一个基于AJAX的网格控件。可以防止window.onbeforeunload在进行AJAX调用时被调用

我们挂钩到window.onbeforeunload事件中,检查它们是否有未保存的数据,如果是这样,就会显示一条消息“您确定要导航...您有未保存的数据...”。

这一切都很好。

但是AJAX调用也会触发window.onbeforeunload,所以如果网格有未保存的数据,并且我们进行AJAX调用(例如删除另一个网格中的一行),用户会得到“您确定要导航...你有未保存的数据......“消息不好。

是否可以抑制AJAX调用的onbeforeunload事件?或者是否有可能检测到呼叫的AJAX呼叫?否则,我们将不得不进行黑客攻击!

感谢

回答

2

这是很奇怪的,你确定你的Ajax调用不加载一个新的链接?

务必阅读本有关规范:onbeforeunload spec

看看Ajax调用可能触发任何在上市要调用表的行动。

+0

感谢。阅读规范,它引用“调用”下的“document.write”。这当然与我们使用的网格库有关。 – Paul 2009-02-11 20:21:05

0

如果你正在谈论ASP.NET AJAX部分回发,那么我今天也遇到了这种行为,做同样的事情。 (如果你没有,完全无视我的职务。)

在到目前为止我的经验,这似乎是,如果你的部分回发是由输入触发,它不会在局部回传时触发onb​​eforeunload ,但是如果部分回发是由超链接触发的,它会。看起来浏览器假设你正在导航,如果你点击锚标签中的任何东西(只在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触发之前通过超链接单击更改标志值。

5

我做了这样的事情:

body标签内:

var allowConfirm = true; 

    window.onbeforeunload = confirmExit; 
    function confirmExit() 
    { 
    if(allowConfirm) 
     return "Are you sure you want to navigate away from this page?"; 
    else 
     allowConfirm = true; 
    } 

当我注销,我把这个脚本:

allowConfirm = FALSE; return window.location.href;

+0

这对我有用。我的“保存”和“取消”链接调用ashx处理程序并强制卸载,并且我不希望保存或取消页面时出现弹出窗口。 – Ray 2015-05-01 20:36:03

30

如果你想通过超链接来触发回传,有一个简单的解决方法: 而不是

<a href="javascript:submitFunction();">Submit</a>

<a href="javascript:;" onclick="submitFunction();">Submit</a>

只需使用此代码:

<a href="#" onclick="submitFunction();">Submit</a>

如果超链接的href属性的内容不是当前页面(该字符表示尖锐字符),IE似乎会触发onb​​eforeunload事件。

+0

这阻止了onbeforeunload事件被解雇。 – dhinesh 2011-08-01 11:29:06

0

这其实工作原理:

OnClientClick="eval(this.href);return false" 
2

在IE6的情况下,或HREF你可以连接回传功能。 即:如果回传功能WebForm_DoPostBackWithOptions和使用jQuery,上述

var DoPostBackWithOptionsHook = null; 

$(document).ready(function(){ 
    DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions; 
    WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook; 
} 

function WebForm_DoPostBackWithOptionsHook(options) { 
    var navigateAwayFlag = $("input[id*='navigateAwayValue']"); 
     if (navigateAwayFlag.length > 0) { 
      navigateAwayFlag[0].value = "false"; } 

    return DoPostBackWithOptionsHook(options) 
} 
0

一种解决方法下面的代码添加以下代码到这个问题是使用jQuery的超级链接标签的单击事件调用submitFunction(),取下HREF来自超链接的属性。

0

这是不可能的,没有办法找出是否按下浏览器的刷新按钮。

0

不使用AJAX,但仍想阻止页面未保存更改。我尝试了以前的大部分建议,包括navigateAway。他们都没有与IE 8的工作。NavigateAway总是返回长度为0.

我确实找到了一个关于在标签中使用类作为ID的解决方案的博客,然后根据它设置布尔值。我尝试过,但它不起作用,因为.NET在输出HTML时将输入标记封装在span标记中,并在其中声明类。我的最终解决方案是在标签的ID名称中放置单词Ignore。此外,为防止在设置布尔值的代码捕获click之前调用onbeforeunload,必须使用如click:Button或asp:Input。最后,(VS IDE的asp力量)起始名称是控制类型; ID = “Button_Save”。使用asp:标签还可以防止两次调用onbeforeunload。

<script type="text/javascript" language="javascript"> 
var stuffchanged = false 
var ignorenavigate = false 

    $(document).ready(function() { 


    //Detect whether the event source has "nonavigate" class specified 
    $("a,input,img,checkbox,button").click(function() { 
     var str = $(this).attr("ID"); 
     ignorenavigate = str.search("Ignore") > 0; 
    }); 

}); 

window.onbeforeunload = confirmExit; 
function confirmExit() { 
    if (stuffchanged && !ignorenavigate) { 
     return "You have attempted to leave this page with unsaved changes. If you have made any changes to the fields without " + 
    "clicking the Save button, your changes will be lost. Are you sure you want to exit this page?"; 
    } 

} 

    function textchanged() { 
    stuffchanged = true; 
    } 

相关问题