22

我有一个基于 AJAX 的网格控件。

我们连接到 window.onbeforeunload 事件以检查他们是否有未保存的数据,如果有,则向他们显示一条消息“您确定要离开...您有未保存的数据...”。

这一切都很好。

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

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

谢谢

4

9 回答 9

30

如果您想通过超链接触发回发,有一个简单的解决方法:

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

或者

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

只需使用此代码:

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

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

于 2010-03-24T13:52:45.240 回答
5

我做了这样的事情:

体内标签:

  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;
  }

当我注销时,我调用这个脚本:

允许确认=假;返回 window.location.href;

于 2009-11-14T13:27:14.650 回答
2

这真的很奇怪,您确定您的 Ajax 调用没有加载新链接吗?

请务必阅读此相关规范:onbeforeunload spec

查看 Ajax 调用是否会触发To invoke表中列出的任何操作。

于 2009-02-11T16:51:59.480 回答
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)
}
于 2011-06-09T21:41:45.533 回答
0

解决此问题的一种方法是使用 jquery 在超链接标记的单击事件上调用 submitFunction() 并从超链接中删除 href 属性。

于 2012-06-09T05:55:52.440 回答
0

如果您谈论的是 ASP.NET AJAX 部分回发,那么我今天也遇到了这种行为,做同样的事情。(如果不是,请完全忽略我的帖子。)

以我目前的经验来看,如果你的部分回发是由一个input触发的,它不会在部分回发期间触发 onbeforeunload ,但如果部分回发是由一个hyperlink触发的,它会。如果您单击锚标记中的任何内容(仅在 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 触发之前单击超链接来更改标志的值。

于 2009-07-21T18:14:09.220 回答
0

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

于 2012-07-24T04:07:06.387 回答
0

这实际上有效:

 OnClientClick="eval(this.href);return false" 
于 2010-03-25T17:46:51.037 回答
0

不使用 AJAX,但仍想防止留下未保存更改的页面。我尝试了大多数先前的建议,包括navigationAway。他们都没有使用 IE 8。NavigateAway 总是返回 0 的长度。

我确实找到了一个博客,上面有关于在标签中使用类作为 ID 的解决方案,然后基于此设置布尔值。我试过了,但它不起作用,因为 .NET 在输出 HTML 时将输入标记包装在 span 标记中,其中声明了类。我的最终解决方案是在标签的 ID 名称中加上 Ignore 一词。此外,为了防止在单击之前调用 onbeforeunload 被设置布尔值的代码捕获,必须使用 ,例如 asp:Button 或 asp:Input。最后,asp 强制(VS IDE 的)起始名称为控件类型;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;
  }

于 2017-01-20T22:29:10.983 回答