Ajax向表单返回false


Ajax return false to form

嗨,当用户登录我的网站时,我想检查我的数据库,以确保他们选择的用户名不存在,以及是否让他们知道。下面的代码不起作用,尽管无论我做什么,ajax中的返回似乎都不会返回到我的表单,并且表单总是提交。为什么会发生这种情况?感谢您的帮助

HTML

<form name="signup" action="Test1.php" onsubmit="return checkUser();" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>

Javascript

<script type="text/javascript" src="jquery-1.7.1.min.js"/></script>
<script type="text/javascript">
    function checkUser(){
        var userV = document.signup.user.value;
        $.ajax({
            url: "Test.php",
            type: "POST",
            data: {user:userV},
            success: function (response) {
                if(response=="0"){
                    //Username already exists notify user
                    return false;
                }else{
                    return true;
                }
            }
        });
    }
</script>

Test.php

<?PHP
    $user = $_POST['user'];
    if($user=="test"){
        die("0");
    }else{
        die("1")
    }
?>

Test1.php

<?PHP
    echo "Form submitted";
?>

您将return值放入ajax调用的success回调中,该回调的执行将延迟到服务器应答。

onsubmit="return checkUser();"checkUser()函数中期望truefalse

function checkUser(){
   if( stuff )
      return true;
   else
      return false;
}

无论如何,这是一个总体上不好的方法,因为它依赖于侵入式javascript。更好的解决方案是将所有客户端逻辑从标记中移出:

HTML

<form name="signup" action="Test1.php" method="get">
    <label for="_user">Username:</label><input type="text" name="user" id="_user"/>
   <input type="submit" value="Submit" />
</form>

JS

<script>
// wrapping the code in a $(function(){ ... }); call delays its execution till document is loaded
$(function(){
$('form[name="signup"]').on('submit', function(event){
    // this prevents browser from actually following form url
    event.preventDefault();
    // a reference to the form to get used inside ajax callback
    var form = this;
    $.ajax({
         url: $(form).attr('action'),
         type: "POST",
         data: {user:$(form.user).val()},
         success: function (response) {
             if(response=="0"){
                alert('User exists!');
             }else{
                alert('User does not exist!');
             }
         }
     });
});
});
</script>

警报应该是给用户的正确消息,或者是更复杂的验证——这只是为了举例。

您在回调中返回false,这太"晚了",因为它将在请求完成时被调用。考虑在函数中添加一个显式的e.preventDefault()return false。目前,它将返回undefined,正如您在"内部"函数中定义的return语句一样。

当然,您需要手动导航到目标页面。

或者将$.ajax()调用的async参数显式设置为false