2012-01-05 18 views
0

我有一个html表单和一些验证表单的jQuery。如果所有的验证通过,我想提交表格。当我按下但是提交,邮件出现的错误(如果有错误),当没有错误信息,提交按钮那种小摊,我得到一个错误当没有错误存在时jQuery表单不提交

不响应的脚本错误

我在firefox和safari中都得到了相同的结果。

的jQuery(错误的div是所有错误的出现):

$("#joinForm").on("submit", function (e) { 
     e.preventDefault(); 

     if (!$(':text').val() || !$(':password').val()){ 

      $('#fillIn').remove(); 
      $('#errors').append("<p id='fillIn'>Please fill in all fields</p>"); 
     } 
     else { 
      $('#fillIn').remove(); 
     } 


     if ($('#email').val()!= $('#reemail').val()){ 
      $('#noMatch').remove(); 
      $('#errors').append("<p id='noMatch'>Emails do not match</p>"); 
     } 
     else{ 
      $('#noMatch').remove(); 
     } 


     if ($('#email').val() == $('#reemail').val() && $(':text').val() && $(':password').val()){ 
      $('#joinForm').submit(); 
     } 
     else{ 
      $('#errorModal').modal('show'); 
     } 

    }); 

}); 

HTML:

<form method='POST' action='join_action.php' id='joinForm'> 
    <table> 
     <tr> 
      <td>Full Name: </td><td><input type='text' name='name'></input></td> 
     </tr> 
     <tr> 
      <td>Email: </td><td><input type='text' name='email' id='email'></input></td> 
     </tr> 
     <tr> 
      <td>Re-type Email: </td><td><input type='text' name='reemail' id='reemail'></input></td> 
     </tr> 
     <tr> 
      <td>New Password: </td><td><input type='password' name='password'></input></td> 
     </tr> 
     <tr> 
      <td><input type='submit' value='Sign Up' name='signup' id='signup'></td> 
     </tr> 
    </table> 
</form> 
+0

这将是simplier使用$('#注册')。on('click'.....',然后调用表单 – arma 2012-01-05 17:10:47

+0

@arma上的提交,但如果用户关闭了JS,我需要表单仍提交 – kirby 2012-01-05 17:12:28

+0

那么if如果你想让你当前的例子工作,把'e.preventDefault();'移到末尾,在那个模态调用之后。 – arma 2012-01-05 17:15:28

回答

3

e.preventDefault();阻止提交表单,然后手动叫submit(),这将发射另一个submit事件,因此你得到了一个无限循环。

要解决该问题,请仅在表单无效时致电preventDefault

$("#joinForm").on("submit", function (e) { 
     var isValid = true; 

     if (!$(':text').val() || !$(':password').val()){ 
      isValid = false; 
      $('#fillIn').remove(); 
      $('#errors').append("<p id='fillIn'>Please fill in all fields</p>"); 
     } 
     else { 
      $('#fillIn').remove(); 
     } 


     if ($('#email').val()!= $('#reemail').val()){ 
      isValid = false; 
      $('#noMatch').remove(); 
      $('#errors').append("<p id='noMatch'>Emails do not match</p>"); 
     } 
     else{ 
      $('#noMatch').remove(); 
     } 


     if (isValid && $('#email').val() == $('#reemail').val() && $(':text').val() && $(':password').val()){ 
      // pass 
     } 
     else{ 
      $('#errorModal').modal('show'); 
      e.preventDefault(); 
     } 

    }); 

}); 
+0

谢谢。我该如何解决?我需要preventDefault立即停止表单提交 – kirby 2012-01-05 17:06:31

+0

查看更新的答案。 – qiao 2012-01-05 17:07:39

+0

我应该在哪里放置preventDefault? – kirby 2012-01-05 17:20:26

1

你最后的if语句切换到这一点:

if (!($('#email').val() == $('#reemail').val() && $(':text').val() && $(':password').val())){ 
     $('#errorModal').modal('show'); 
     e.preventDefault(); 
    } 

而且从你的代码的顶部去除e.preventDefault()

这只是改变的逻辑说:“如果我们有错误,显示模式和停止提交,否则,进行提交。”

+0

这将如何工作?模态显示何时出现错误。这个if语句确保没有错误 – kirby 2012-01-05 17:14:01

+0

我测试了这个并且它没有工作 – kirby 2012-01-05 17:18:36

+0

我把你的整个if语句包装在一个!()中,以便给出与你最初寻找的东西相反的东西。如果它不工作,你需要修改if语句,无论是什么意思“有错误” – idrumgood 2012-01-05 17:22:59

0

试试这个:

$('#joinForm').submit(function(){ 

    if (!$(':text').val() || !$(':password').val()){ 

     $('#fillIn').remove(); 
     $('#errors').append("<p id='fillIn'>Please fill in all fields</p>"); 
    } 
    else { 
     $('#fillIn').remove(); 
    } 


    if ($('#email').val()!= $('#reemail').val()){ 
     $('#noMatch').remove(); 
     $('#errors').append("<p id='noMatch'>Emails do not match</p>"); 
    } 
    else{ 
     $('#noMatch').remove(); 
    } 


    if ($('#email').val() == $('#reemail').val() && $(':text').val() && $(':password').val()){ 
     $('#joinForm').submit(); 
    } 
    else{ 
     $('#errorModal').modal('show'); 
    } 

    return false; 
}); 

见结束:

return false;

再见!

1

只有在出现错误时,您才应该使用e.preventDefault();。做esiest方法是,声明一个标志,并将其设置为true时,有一个错误,做这样的事情,

$("#joinForm").on("submit", function (e) { 
    var isError = false; // set the flag to false initially 

// do whatever you want. 

    if(error conditions) 
    isError = true; /// do this wherever you are expecting error 

    // do something else   

    if(isError) 
     e.preventDefault(); 
}); 
0

工作1.7.1 jQuery代码:

$(function() { 
     $("#joinForm").on("submit", function() { 
      var validForm = true; 
      if (!$(':text').val() || !$(':password').val()){ 

       $('#fillIn').remove(); 
       $('#errors').append("<p id='fillIn'>Please fill in all fields</p>"); 
       validForm = false; 
      } 
      else { 
       $('#fillIn').remove(); 
      } 


      if ($('#email').val()!= $('#reemail').val()){ 
       $('#noMatch').remove(); 
       $('#errors').append("<p id='noMatch'>Emails do not match</p>"); 
       validForm = false; 
      } 
      else{ 
       $('#noMatch').remove(); 
      } 


      if (validForm){ 
       $(this).submit(); 
      } 
      else{ 
       $('#errorModal').modal('show'); 
      } 
     return false; 
    }); 
    }); 
+0

谢谢,但它没有奏效。同样的结果 – kirby 2012-01-05 17:35:46

+0

你使用的是什么版本的jquery?它适用于我1.7.1 – arma 2012-01-05 17:37:04

+0

http://jsfiddle.net/armababy/uXMSL/8/ – arma 2012-01-05 17:52:33