【问题标题】:form submit always return true while it should return false表单提交总是返回 true 而它应该返回 false
【发布时间】:2015-01-17 17:23:35
【问题描述】:

我在使用此代码提交之前验证表单

<form method="post" onsubmit="return reg()">
<table>
<tr>
<td>Name</td>
<td><input type="text" name="username" id="username" autocomplete="off" ></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password" id="password" autocomplete="off" ></td>
</tr>
<tr>
<td>Email</td>
<td><input type="email" name="email" id="email" autocomplete="off"></td>
</tr>
<tr>
<td>Phone</td>
<td><input type="text" name="phone" id="phone" autocomplete="off" placeholder="001**********"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="register" id="register" value="register"></td>
</tr>
</table>
</form>

还有这个js代码

function reg(){
    var user = $("#username").val(),
        pass = $("#password").val(),
        city = $("#city").val(),
        email = $("#email").val(),
        phone = $("#phone").val();

    if(user.length<4){
        alert('short name');
        return false;
    }
    else if(pass.length<6) {
        alert('password error');
        return false;
    }
    else if(city.length<3) {
        alert('city error');
        return false;
    }
    else if(phone.length<6) {
        alert('phone error');
        return false;
    }
    else{
        $.post('ajax/checkex.php?user='+user+"&email="+email).done(function (data) {
            if(data.indexOf('user') !== -1){
                alert('user name is not available');
                return false;
            }
            else if(data.indexOf('email') !== -1){
                alert('email address is already registered');
                return false;
            }
            else if(data.indexOf('available') !== -1){
                return true;
            }
        });
      //return false;
    }
}

但是表单总是提交,ajax 代码根本不起作用。它甚至不会像alert(data) 那样提醒内部的任何东西。

即使之前已经注册了姓名和电子邮件,js代码也会返回true。

当我取消注释最后一个 return false 行时,它返回 false 并且 ajax 工作正常,但确保表单根本不提交。那么这段代码的错误在哪里呢?

【问题讨论】:

  • ajax 是异步的,即使它没有从回调内部返回布尔值,也不会将任何信息返回给reg()。建议您阅读远程 ajax 验证
  • 问题似乎与 Ajax 的异步特性有关。返回后调用.done函数。
  • return 在 .done 里面,如果后面没有 return false,它就不起作用,所以如何检查用户或电子邮件是否未注册并使用 Ajax 返回 false 或 true

标签: jquery ajax forms validation


【解决方案1】:

这将始终发布表单。如果你想用 jquery 提交表单,你可以使用submit 事件。

您可以使用 event.preventDefault 方法来阻止表单提交。

一个简单的例子

$("myForm").submit(function(ev){
   ev.preventDefault();
   //Check if the inputs are valid
   if( formvalid ){
      $.ajax() //Make your ajax call 
   }
})

另见:Submit a form using jQuery

编辑:如果您的 ajax 调用返回 false,则不应提交

$("myForm").submit(function(ev){
  $.ajax({
    url: "url",
    type: "post",
    async: false, //To make the ajax call synchronous
    success: function(valid){
      if(!valid)
        ev.preventDefault();
    }
  }); 
})

【讨论】:

  • $("#regForm").submit(function (e) { e.preventDefault(); 如果 ajax 返回 true,则在此处验证 ajax:$("#regForm").submit(); ajax 工作,但表单没有提交,因为默认操作已被阻止
  • 您的目的不是阻止表单提交并通过ajax调用提交数据吗?我就是这么理解的。如果您只想使用 ajax 调用进行验证,您可以进行同步 ajax 调用并仅在返回 false 时调用 ev.preventDefault。
  • 目的是检查用户名和电子邮件地址的可用性然后正常提交表单
  • 非常感谢您的帮助。
  • 在这种情况下尝试编辑。我没有用它进行测试,但它应该可以看到你以前的主要问题是 ajax 调用的异步性质,使其同步应该可以解决它。但是,这不是我推荐的优雅解决方案。有更好的方法来验证表单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2019-03-29
  • 2014-10-21
相关资源
最近更新 更多