每当我连续两次调用一个函数时,它只评估第二个函数并离开第一个函数。同样在链式IF语句中,它不能按预期工作。它总是跳到''''。继承我的代码
if (valNames() && valEmail() && valUname()) {
l1.hide();
l2.show();
}
更新以下是完整代码:
<script type="text/javascript">
$(document).ready(function () {
var cont = $('#cont');
var l1 = $('#l1');
var l2 = $('#l2');
var names = $("#names");
var uname = $("#uname");
var email = $("#email");
var err = $('#error');
email.blur(function () {
valEmail();
});
uname.blur(function () {
valUname();
});
l2.hide();
cont.click(function () {
if (valNames() == true && valEmail() == true && valUname() == true) {
l1.hide();
l2.show();
}
});
function valNames() {
if (names.val().length < 5) {
names.css({'border-color': 'red'});
return false;
} else {
names.css({'border-color': 'blue'});
return true;
}
}
function valEmail() {
if (IsEmail(email.val())) {
$.ajax({
dataType: "json",
url: "se.php",
type: "POST",
data: {'r': '648am', 'i': 'ee', 'd': email.val(), 't': 2},
success: function (data) {
if (data.data == false) {
email.css({'border-color': 'blue'});
err.hide();
return true;
} else {
email.css({'border-color': 'red'});
err.html("The email you entered already exists. <a href='login'>login?</a>");
err.show();
return false;
}
}
});
} else {
email.css({'border-color': 'red'});
return false;
}
}
function valUname() {
if (uname.val().length > 5) {
$.ajax({
dataType: "json",
url: "se.php",
type: "POST",
data: {'r': '648am', 'i': 'ue', 'd': uname.val(), 't': 1},
success: function (data) {
if (data.data == false) {
uname.css({'border-color': 'blue'});
err.hide();
return true;
} else {
uname.css({'border-color': 'red'});
err.html("The Username you entered already exists. <a href='login'>login?</a>");
err.show();
return false;
}
}
});
} else {
uname.css({'border-color': 'red'});
err.html("The Username you entered is too short.");
err.show();
return false;
}
}
});
</script>
答案 0 :(得分:1)
在$.ajax
和valEmail
中使用valUname
进行异步请求,这意味着函数始终在请求完成之前返回。由于在$.ajax
行之后没有显式返回,因此函数返回undefined
,其被视为false
。从这个意义上讲,valEmail
和valUname
将始终返回false
。
您最好的选择是完全改变逻辑并使用类似的东西:
$.ajax({ // first request to validate email
...,
success: function() {
...
if (emailValid) {
$.ajax({ // second request to validate username
...,
success: function() {
if (usernameValid && valNames()) { // direct validation
l1.hide();
l2.show();
}
}
});
}
...
}
})
有一些方法可以使它更简单,你可以使它并行而不是顺序,但你仍然需要了解如何处理异步操作以及如何链接ajax请求。