为什么OnBeforeUnload使用asp:LinkBut​​ton两次触发?

时间:2010-02-10 18:46:58

标签: asp.net jquery webforms onbeforeunload

我有以下Jquery函数,当用户有未保存的更改(类似于SO的做法)并尝试离开当前屏幕时,通知用户提示。

<!-- in my aspx page -->
<script type="text/javascript" language="javascript">
    window.onbeforeunload = function()
    {
        if (HasPendingUpdates())
        {
            return "Changes you have made will not be saved.";
        }
    }
</script>

这可以按预期工作,并在用户尝试单击href以浏览或使用后退按钮等时显示消息框。我遇到的问题是我的一个链接是asp:LinkButton,因为它需要在离开页面之前触发一些服务器端代码。当用户点击此LinkButton时,他们会收到提示两次。

方案:

  1. 用户点击LinkButton
  2. 出现提示,用户点击取消按钮。
  3. 提示消失,用户仍在屏幕上。 GOOD。

  4. 用户点击LinkButton

  5. 出现提示并单击“确定”按钮。
  6. 提示消失,同样的提示再次显示。
  7. 用户再次点击“确定”。
  8. 提示消失,用户移动到下一个屏幕,一切都很好。
  9. 那我为什么得到第二个提示??? OnBeforeUnload如何触发两次?

3 个答案:

答案 0 :(得分:2)

我有类似的问题,但是,我根本不想为LinkBut​​tons启动onbeforeunload,因此我对.aspx页面上的每个LinkBut​​ton使用了以下内容:

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

LinkBut​​tons的功能并没有削弱,因为他们所做的只是提供一个带有CommandArgument的Command,以便代码隐藏处理......

答案 1 :(得分:0)

使用jQuery添加处理程序将它们堆叠起来。如果你为你的hrefs分配一个带有jQuery函数的处理程序,然后再为你的链接按钮分配它,那么就会有两个处理程序。

检查绑定onunload处理程序的频率,并确保您要解除之前处理​​程序的绑定或仅执行一次。

答案 2 :(得分:0)

以下是解决此问题的方法:

    var checkChangesEnabled = true;
    window.onbeforeunload = confirmExit;

    function confirmExit() {
        if (checkChangesEnabled) {
            event.returnValue = "Changes you have made will not be saved.";
            disableCheck();
        }
    }

    function disableCheck() {
        checkChangesEnabled = false;
        setTimeout("enableCheck()", "100");
    }

    function enableCheck() {
        checkChangesEnabled = true;
    }