如何从ajax回调中控制表单提交?

时间:2012-06-18 22:09:04

标签: javascript jquery ajax callback form-submit

我最初在我的ajax回调中有return true/false,并意识到它可能不在正确的上下文中被调用,所以我重写了我的函数如下,但它仍然无效。提交变量是否也没有从回调函数中执行?确认(if .btn-danger)正在运行,但不仅仅是您点击提交并且不需要确认)

$('#form').submit(function(e){
    var submit = false;
    if($('.btn-danger').length){
        submit = true;
    } else {
        $.ajax({
            url: base_path+"ajax/myajaxfile",
            type: "post",
            data: {
                data1 : $("#amount").val(),
                data2 : $("option:selected").val()
            },
            dataType: "json",
            success: function(data) {
                if (data.needconfirmation === 'true'){
                        $('#edit-submit').val("Confirm");
                        $('#edit-submit').removeClass("btn-primary");
                        $('#edit-submit').addClass("btn-danger");
                        $('#payment-form').after('<span class="warning"> Do you really wanna?</span>');
                } else {
                    submit = true;
                }
            },
            error: function(data) {
                alert("an error has occurred");
            }
        });
    }
    if (submit){
        return true;
    } else {
        return false;
    }
});

3 个答案:

答案 0 :(得分:1)

我认为您的问题是默认情况下ajax调用是异步的 - 因此在调用成功函数之前正在评估函数的返回值,因此提交变量仍为false。

您需要使ajax调用同步:

async: false

或者可能更好的是重组它。

答案 1 :(得分:0)

$.ajax是异步的,因此代码的其余部分会在成功回调发生之前继续,因此设置submit = true不会影响函数末尾的检查。

  

确认(如果.btn-danger)正在运行,但不仅仅是你点击提交并且不需要确认

您如何知道是否需要确认?您可能需要在检查.btn-danger的位置添加支票。

此外,您只需执行

即可清理代码的最后一位
return submit;

答案 2 :(得分:0)

第一次做AJAX最令人困惑的一个方面是异步部分。使用普通的Javascript(至少是普通的jQuery),你可以像这样处理提交:

$('#form').submit(function(e){
    var submit = /*Figure out if it was a success or not*/;
    if (submit){
        return true;
    } else {
        return false;
    }
});

一个事件触发提交,你弄清楚它是否有效,然后你要么继续,要么你没有。

通过AJAX提交虽然“弄清楚它是否成功”步骤发生在正常流程之外。这意味着你想要做的就是总是返回false;你不知道是否继续,所以不要继续。你的AJAX回调(你的AJAX调用选项中的“成功:”函数)是“弄清楚”代码是否成功,你的当前正确的想法是“success = true”......除了它结算时,您的原始提交功能已经结束(您将返回false)。

那么,你需要做的就是修改你的成功处理程序......无论你提交什么通常会发生什么。这可能就像隐藏表单的form.submit()一样简单,也可能更复杂;我不知道你的应用程序。希望这能为您提供基本的想法。