我最初在我的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;
}
});
答案 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()一样简单,也可能更复杂;我不知道你的应用程序。希望这能为您提供基本的想法。