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

How do I control form submission from within ajax callback?

本文关键字:控制 表单提交 回调 ajax      更新时间:2023-09-26

我最初在我的 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;
    }
});

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

您需要使 ajax 调用同步:

async: false

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

第一次做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 调用选项中的"成功:"函数)是"找出"代码是否运行,并且您当前对"成功 = true"有正确的想法......除了当它解析时,你原来的提交函数已经结束了(你会返回 false)。

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

$.ajax

异步的,因此在成功回调发生之前,代码的其余部分将继续,因此它设置submit = true不会影响函数结束时的检查。

确认

(如果.btn-danger)有效,但不仅仅是如果您点击提交并且不需要确认

你怎么知道是否需要确认? 您可能希望在其中添加检查.btn-danger

此外,您可以通过执行

return submit;