嗨,当用户登录我的网站时,我想检查我的数据库,以确保他们选择的用户名不存在,以及是否让他们知道。下面的代码不起作用,尽管无论我做什么,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()
函数中期望true
或false
值
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
。