2012-06-18 27 views
0

我最初在我的ajax回调中有return true/false,并且意识到它可能不在正确的上下文中被调用,所以我重写了我的函数,如下所示,但它仍然不起作用。提交变量是否没有从回调函数中传递?确认(if .btn-danger)工作,但不只是如果你打提交并且不需要确认)如何从ajax回调中控制表单提交?

$('#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; 
    } 
}); 
+1

你的代码看起来像有时你想传统的提交,而其他人你想要一个AJAX提交。这听起来不对,是吗?如果不是,那么当.btn-danger具有长度时,你想要发生什么?如果没有,你想要发生什么? – Colin

+0

表单本身是通过表单上的提交按钮按常规提交的。 ajax调用进行数据库检查,以确定在提交之前是否应该要求用户确认他们的操作,否则应该正常进行。我想也许我需要做点击,而不是表单提交,然后以编程方式调用表单提交内的回调... – Damon

回答

1

我觉得你的问题是,AJAX调用都是异步的 - 所以函数的返回值是在成功函数被调用之前进行评估,因此提交变量仍然是错误的。

你需要要么使AJAX调用同步:

async: false 

或可能会更好。将重组它。

0

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

确认(如果.btn-危险)工作,只是如果你打不提交并且不需要

确认你怎么知道是否需要或不确认?您可能需要为您检查的地方添加支票.btn-danger

此外,您还可以通过只是在做

return submit; 
+0

检查.btn危险是如何做到这一点.. – Damon

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:”函数)是否是“数字输出”代码,并且你的目前正确的想法是“success = true”......除非它解决的时候,你原来的提交函数已经结束了(你将会返回false)。

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

+0

是的..这是有道理的。我原本在回调里面有'返回true',但它在表单上没有返回true。我可以切换到一个点击功能,而不是提交.. – Damon

+0

好的一个clickhandler不会这样做:/我得到异步部分,这就是为什么它不工作。但我不知道如何命令表单重新提交,这样可以在没有陷入无限循环且条件正常工作的情况下工作(主要是在不需要确认时不运行ajax) – Damon

+0

有几种方法。一种是完全使用不同的形式,也许可以将输入复制到它上面......但我不会推荐。另一种是在第二次调用提交之前简单地解除绑定提交处理程序;这不是一个不好的方法。 但是,更好的方法(恕我直言)是只使用AJAX提交也。 AJAX请求与表单提交(大多数情况下)是一样的;事实上,在网络的“旧时代”,人们通过iframe和表单提交“AJAX”。如果你的表单使用GET作为它的方法(默认),你可以这样做: – machineghost