2013-07-14 216 views
1

我的表单有一个输入需要在提交之前进行验证。成功验证后,我尝试提交表单,但不提交。如何在AJAX验证后使用jQuery提交表单?

我的代码如下所示:

$(document).ready(function() { 
    $("#myForm").submit(function() { 
     checkInputData(); 
     return false; // to prevent default submit 
    }); 
}); 

验证功能:

function checkInputData() { 
    var id = $($("#id")).val(); // value, which needs to be validated 
    $.get("check.php?id=" + id, 
     function(result){ 
      if(result == 1) { 
       //if the result is 1, need to submit 
       $("#myForm").unbind(); // to prevent recursion? 
       $("#myForm").submit(); // doesnt work 
      } else { 
       // dont submit, give some visual feedback, etc... 
      } 
    }); 
} 

我到底做错了什么?谢谢。

+0

你在控制台中的任何错误? –

+0

为什么不在提交表单时进行验证而不是两次前往服务器?您的验证方法,现在可以被击败,除非您在表单提交重新验证。 –

+0

控制台中没有错误。 需要在提交前进行验证,因为表单提交的图片较大。 – Dusan

回答

4

您需要从AJAX验证请求中返回结果。您可以通过将此检查设置为async: false来执行此操作,这意味着checkInputData()将等待结果返回,并且您可以将其返回,从而控制表单的提交。

在您的代码中,它不会等待$.get动作发生,它似乎跳过了意味着您的代码始终显示为checkInputData()呼叫的return true;。如果按以下方式使用,则无需提交return false

我已经使用代替$.get$.ajax调用,因为它可以让你控制async属性,但它本质上是做同样的事情。你可以阅读更多关于它here

function checkInputData() { 
    var value = $("#id").val(); // Value to be validated 
    var passedValidation = false; 
    $.ajax("check.php?id=" + value, { 
     async: false, 
     success: function(result){ 
      // Do whatever check of the server data you need here. 
      if(result == "1") { 
       // Good result, allow the submission 
       passedValidation = true; 
      } else { 
       // Show an error message 
      } 
     } 
    }); 
    return passedValidation; 
} 

$(document).ready(function() { 
    $("#myForm").on("submit", function() { 
     return checkInputData(); 
    }); 
}); 

我假设你有一个按钮,如下面的表格内的ID myForm

<input type="submit" value="Submit Form" /> 
+1

这是工作。 async:false是解决方案。谢谢你的帮助! – Dusan

+0

@Dusan不客气,很高兴你有它的工作。 – Scott

+1

其他人阅读此:这是不好的建议,永远不要这样做 - 这将挂起浏览器等待响应。 –

-1
 $(document).ready(function() { 
      $("#myForm").submit(function (e) { 
       checkInputData(); 
       //return false; // to prevent default submit <-- THIS IS WRONG 


       e.preventDefault(); //Try this :) 
      }); 
     }); 

返回false将阻止它在所有情况下提交。

+3

这不是真的解释发生了什么问题。添加你改变的描述,而不仅仅是一些“这是错误的”代码注释 – Bojangles

0

它没有得到提交的可能是因为你没有在下面if condition

if(result == 1) { 

上验证成功返回1resultcheck.php你的输出应该是1,像echo '1';如果输入有效。并确保在它之前或之后没有任何其他输出。

0

AMember是正确的你总是返回false,也有一些解决方案。一种解决方案是让你将验证绑定到一个按钮元素或任何不会提交表单的元素。

HTML

<form id="myForm"> 
    . 
    input elements 
    . 
    <button class= "submit" type="button" onclick="submit">Submit</button> 
</form> 

文档准备

$(function() 
{ 
    var $submit = $(".submit"); 

    $submit.click(function() 
    { 
    checkInputData(); 

    }); 
}); 

验证回调函数

function checkInputData() 
{ 
    var id = $('#id').val(); // value, which needs to be validated 

    $.get("check.php?id=" + id, function(result) 
    { 
     if(result == 1) 
     { 
      var $myForm = $("#myForm"); 

      //if the result is 1 submit. 
      $myForm.submit(); 
     } 
     else 
     { 
      // dont submit, give some visual feedback, etc... 
     } 
    }); 

}

+0

绑定到'submit'事件是更好的方法。如果您使用诸如iOS的移动浏览器,它将允许您使用它自己的UI提交键盘上的Submit按钮,从而避免您的按钮和验证。有些浏览器在按下返回键时也会提交表单。 submit事件的目的是控制验证。 – Scott

+0

@Scott如果你的支持移动平台,你正确的解决方案将是一个不正确的设计。据说这个用户只能在表单中存在类型为submit的输入时绕过按钮。由于在我的例子中,我没有任何类型的输入提交ios键盘按钮将无法正常工作。 –

+0

感谢您的回复。正如你的例子要求OP为了防止移动平台上的提交问题而避免使用'input type =“submit”/>'而不是'',这不像你指出一个合适的跨平台解决方案;您也正在对OP进行不必要的设计约束。除非另有说明,否则最好假设他们也希望支持移动平台。因此它不能被吹捧为“最好的解决方案是给你的”。你的回答促进了不好的行为,直到它更新更合适我无法删除我的downvote。 – Scott

相关问题