如何在用户提交表单时禁用beforeunload操作?

时间:2011-01-24 22:32:46

标签: javascript jquery ajax onbeforeunload

我有一小段代码:

<script>
$(window).bind('beforeunload', function() {
  $.ajax({
    async: false,
    type: 'POST',
    url: '/something'
    });
  });
</script>

我想知道,当用户点击提交按钮时,如何禁用此请求。

基本上就像这样,在SO上。当您提出问题并决定关闭页面时,您会看到一个警告窗口,但是当您提交表单时不会发生这种情况。

7 个答案:

答案 0 :(得分:37)

使用beforeunload事件处理程序调用{​​{3}}:

$('form#someForm').submit(function() {
   $(window).unbind('beforeunload');
});

要阻止提交表单,请添加以下行:

   return false;

答案 1 :(得分:19)

使用

$('form').submit(function () {
    window.onbeforeunload = null;
});

在主要提交功能之前确保你有这个! (如果有的话)

答案 2 :(得分:0)

这就是我们使用的:

在准备好的文件上,我们调用了beforeunload函数。

$(document).ready(function(){
    $(window).bind("beforeunload", function(){ return(false); });
});

在任何提交或location.reload之前,我们取消绑定变量。

$(window).unbind('beforeunload');
formXXX.submit();

$(window).unbind("beforeunload"); 
location.reload(true);

答案 3 :(得分:0)

我正在寻找检测ASP.NET web应用程序的onbeforeunload, 如果使用带有母版页和内容页的ASP.NET在页面上更改某些输入控件,我将显示警告消息。我在母版页上使用了3个内容占位符,最后一个占用了表单

<form runat="server" id="myForm">

所以在表单结束标记之后和正文结束标记之前使用此脚本

<script>
        var warnMessage = "Save your unsaved changes before leaving this page!";
        $("input").change(function () {
            window.onbeforeunload = function () {
                return 'You have unsaved changes on this page!';
            }
        });
        $("select").change(function () {
            window.onbeforeunload = function () {
                return 'You have unsaved changes on this page!';
            }
        });
        $(function () {
            $('button[type=submit]').click(function (e) {
                window.onbeforeunload = null;
            });
        });
    </script>
就绑定而言,

beforeunload不会以这种方式可靠地工作。你应该原生地分配它

所以我让它工作就像这个绑定和unbind没有为我工作也使用jQuery 1.7以后事件API已经更新,.bind()/。unbind()仍可用于向后兼容,但首选方法是使用on()/ off()函数。

答案 4 :(得分:0)

 <!DOCTYPE html>
 <html>
  <head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script type="text/javascript" src="http://cdn.jsdelivr.net/jquery.dirtyforms/2.0.0-beta00006/jquery.dirtyforms.min.js"></script>
  <script type="text/javascript">
    $(function() {
        $('#form_verify').dirtyForms();
    })
  </script>
  <title></title>
 <body>
<form id="form_verify" action="a.php" method="POST">
    Firt Name <input type="text">
    Last Name <input type="file">
    <input type="submit">   
</form>

答案 5 :(得分:0)

如果您使用绑定,则使用此:

$('form').submit(function () {
    $(window).unbind('beforeunload');
});

这对于所有表单提交都是有益的。

答案 6 :(得分:0)

超级老问题,但可能对其他人有用。

对我来说,仅将“ beforeunload”与“ submit”事件分开是不可行的-因为即使在用户必须修复的表单中存在错误时,也会调用提交处理程序。因此,如果用户尝试提交表单,然后收到错误,然后单击到另一个页面,则他们可以在没有警告的情况下离开。

这是我的解决方法,效果似乎很好。

(function($) {

    var attached = false,
        allowed = false;

    // catch any input field change events bubbling up from the form
    $("form").on("change", function () {
        // attach the listener once
        if (!attached) {
            $("body").on("click", function (e) {
                // check that the click came from inside the form
                // if it did - set flag to allow leaving the page
                // otherwise - hit them with the warning
                allowed = $(e.target).parents("form").length != 0;
            });

            window.addEventListener('beforeunload', function (event) {
                // only allow if submit was called 
                if (!allowed) {
                    event.preventDefault();
                    event.returnValue = 'You have unsaved changes.';
                }

            });
        }                
        attached = true;
    });

}(jQuery));

这样,如果单击以使页面离开表单内部(如“提交”按钮),则不会显示警告。如果单击该离开页面的页面来自表单外部,那么它将警告用户。