2

我有以下 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. 提示消失,用户仍在屏幕上。好的。

  4. 用户点击LinkButton

  5. 出现提示并单击确定按钮。
  6. 提示消失,同样的提示再次出现。
  7. 用户再次单击确定。
  8. 提示消失,用户移动到下一个屏幕,一切都很好。

那为什么我得到第二个提示???OnBeforeUnload 如何触发两次?

4

3 回答 3

2

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

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

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

于 2012-08-08T21:24:27.837 回答
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;
    } 
于 2012-06-07T18:50:06.627 回答
0

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

检查您绑定 onunload 处理程序的频率,并确保您取消绑定以前的处理程序或只执行一次。

于 2010-02-10T18:59:59.480 回答