64

我有一个小问题。我试图捕捉窗口的 OnUnLoad 事件并询问确认问题,如果用户决定他们想留下那么很好,如果他们想离开页面,那么他们将丢失所有未保存的数据。这里的问题...

我正在使用 jQuery UI 对话框,当我将以下代码放在我的页面上时,我打开了对话框,当我单击浏览器上的后退按钮时,它永远不会弹出 msgbox。它只是刷新页面:

<script type="text/javascript"> 
    $(window).bind('beforeunload', function() { 
            alert('you are an idiot!'); 
        } 
    );
</script>

我使用的解决方案是这里的一个帖子。同样,如果我没有打开 jQuery UI 对话框,msgbox 将正常显示。如果我这样做了,那么它不会显示 msgbox 而只是刷新页面。

有任何想法吗?

4

6 回答 6

111

显示警报的正确方法是简单地返回一个字符串。不要alert()自己调用该方法。

<script type="text/javascript">
    $(window).on('beforeunload', function() {
        if (iWantTo) {
            return 'you are an idiot!';
        }
    }); 
</script>

另请参阅:https ://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

于 2009-12-11T17:08:44.660 回答
43

您还可以通过提交特定表单来例外离开页面:

$(window).bind('beforeunload', function(){
    return "Do you really want to leave now?";
});

$("#form_id").submit(function(){
    $(window).unbind("beforeunload");
});
于 2011-06-17T12:14:57.527 回答
14

这对我有用

$(window).bind('beforeunload', function() {
      return 'Do you really want to leave?' ;
});
于 2010-10-28T10:05:06.033 回答
1

jQuery API 明确表示不要绑定到 beforeunload,而应该直接绑定到 window.onbeforeunload,我只是遇到了一个非常糟糕的内存,部分原因是使用 jQuery 绑定到了 beforeunload。

于 2011-03-28T17:00:28.797 回答
1

这对我有用:

window.addEventListener("beforeunload", function(event) {
  event.returnValue = "You may have unsaved Data";
});

于 2016-05-18T22:03:01.290 回答
0

对于 ASP.NET MVC,如果您想通过提交特定表单来为离开页面设置例外:

设置表单ID:

@using (Html.BeginForm("Create", "MgtJob", FormMethod.Post, new { id = "createjob" }))
{
  // Your code
}



<script type="text/javascript">

  // Without submit form
   $(window).bind('beforeunload', function () {
        if ($('input').val() !== '') {
            return "It looks like you have input you haven't submitted."
        }
    });

    // this will call before submit; and it will unbind beforeunload
    $(function () {
        $("#createjob").submit(function (event) {
            $(window).unbind("beforeunload");
        });
    });

</script>
于 2017-04-28T19:28:07.240 回答