0

我最初return true/false在我的 ajax 回调中有 ,并意识到它可能不在正确的上下文中被调用,所以我重写了我的函数如下,但它仍然无法正常工作。提交变量是否也没有从回调函数中执行?确认 ( 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;
    }
});
4

3 回答 3

1

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

您需要使 ajax 调用同步:

async: false

或者可能更好的是对其进行重组。

于 2012-06-18T22:34:15.157 回答
0

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

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

你怎么知道是否需要确认?您可能希望在您检查的地方添加一个检查.btn-danger

此外,您只需执行以下操作即可清理代码的最后一点

return submit;
于 2012-06-18T22:37:36.590 回答
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 调用选项中的“成功:”函数)是“弄清楚”代码是否运行,并且您目前对“成功 = true”有正确的想法......除了它解决时,您原来的提交功能将已经结束(您将返回 false )。

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

于 2012-06-18T22:40:56.113 回答