2

嗨,我希望在用户注册我的网站时检查我的数据库,以确保他们选择的用户名不存在,如果它确实让他们知道。我下面的代码不起作用,尽管无论我做什么并且表单总是提交,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>

测试.php

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

测试1.php

<?PHP
    echo "Form submitted";
?>
4

2 回答 2

3

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

onsubmit="return checkUser();"期望函数中有一个truefalsecheckUser()

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>

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

于 2012-08-24T17:40:32.533 回答
1

false在回调中返回,那太“晚”了,因为它会在请求完成时被调用。考虑将显式e.preventDefault()或添加return false到您的函数中。目前,它将返回undefined,因为您已return在“内部”函数中定义了该语句。

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

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

于 2012-08-24T17:33:12.367 回答