如何使用jQuery $ .ajax函数来停止或允许表单提交?

时间:2010-03-05 00:54:57

标签: jquery ajax

$('#post_form').submit(function() {
    $("#ajax_bar_loader").show();
    $.ajax({
        url: 'add.html',
        data: $('#post_form').serialize(),
        dataType: 'json',
        type: 'post',
        success: function( result ) {
            retVal = formCheck( result );
        }
    });

    return false;
});

这就是我的代码看起来像而不是“return false”,如果“result”中包含的数据说明,我想允许它。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:3)

你可以这样做:

$.ajax({
    url: 'add.html',
    data: $('#post_form').serialize(),
    dataType: 'json',
    type: 'post',
    success: function( result ) {
        retVal = formCheck( result );
        if(retVal)
          $('#post_form').unbind('submit').submit();
        else
          alert('Error with your form! Oh crap!');
    }
});

由于你回发并离开,这只是取消绑定这个处理程序,如果成功,并让提交在调用时正常发生,所以代码不会运行并再次检查,它只是提交。

答案 1 :(得分:2)

我建议始终在事件处理程序的末尾返回false,以防止正常的表单提交。在成功回调到$.ajax的过程中,您可以根据服务器的响应有条件地重定向:

$('#post_form').submit(function() {
    $("#ajax_bar_loader").show();
    $.ajax({
        url: 'add.html',
        data: $('#post_form').serialize(),
        dataType: 'json',
        type: 'post',
        success: function( result ) {
            if(result == 'something') {
                alert("some error happened");
            } else {
                // assuming we're visiting the form's action
                window.location.href = $(this).attr("action");
            }
        }
    });
    return false;
});

在提交处理程序完成执行之前依赖成功回调是不现实的,因为在成功回调执行之前很可能会评估$.ajax调用之后的代码($.ajax将异步运行)。

答案 2 :(得分:0)

    success: function(result) {
        ...
        document.forms.post_form.submit();
    }

答案 3 :(得分:0)

我不确定这是否适用于你的问题,但是如果你使ajax请求同步怎么办?

我将这个虚拟代码设置为“工作”,它会触发ajax请求,然后设置一个布尔值。然后表单根据布尔值返回true或false:

$(document).ready(function() {
    $('form').submit(function() {
        var should_return = false;
        $.ajax({
            async: false,
            url: 'test.php',
            type: 'post',
            success: function() {
                // Do some type of check
                should_return = true;
            }
        });
        return should_return;
    });
});