如果以下ajax脚本没有返回1,我试图为整个validator.registercallback函数返回true。但是,它不起作用,我认为它可能是我缺少的基本内容,但我无法理解。
validator.registerCallback('unique_username', function(value) {
//use ajax to run the check
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
if(xmlhttp.responseText != 1) {
alert('Username Exists');
return false;
} else {
alert('Username Available!');
return true;
}
}
}
xmlhttp.open("GET","uniqueuser.php?username="+value,true);
xmlhttp.send();
})
奇怪的是,以下工作,它只是根据ajax脚本的值不起作用:
validator.registerCallback('unique_username', function(value) {
//use ajax to run the check
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
if(xmlhttp.responseText != 1) {
alert('Username Exists');
return false;
} else {
alert('Username Available!');
return true;
}
}
}
xmlhttp.open("GET","uniqueuser.php?username="+value,true);
xmlhttp.send();
return true;
})
基本上,我可以告诉它在main函数中返回true,但是当我尝试使它返回true时,如果ajax脚本中的值没有返回1,则它不起作用。顺便说一句,警报工作。所以它得到了正确的值,但它不会返回true,或者就此而言是假的。
感谢任何帮助!
更新
validator.registerCallback('unique_username', function(value) {
//use ajax to run the check
function ajax_result() {
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
}
}
xmlhttp.open("GET","uniqueuser.php?username="+value,true);
xmlhttp.send();
}
if(ajax_result() != 1) {
alert('Username Exists');
return false;
} else {
alert('Username Available!');
return true;
}
})
答案 0 :(得分:1)
您缺少的是ajax调用异步。当你的函数结束时,ajax调用还没有完成,值(true或false)只会在以后返回。
要解决此问题,您需要使ajax调用同步或修改链接逻辑,例如将其反转并在ajax调用中运行validator.registerCallback()。您还可以考虑一些更复杂的技术,如promises。
[更新]这是您同步请求的方式:
xmlhttp.open("GET","uniqueuser.php?username="+value,false);
您还需要更改其余代码,例如参见this MDN article。
答案 1 :(得分:0)
您已将jQuery添加到此问题的关键字列表中,因此我使用jQuery回答:
var username = "foo";
$.get('uniqueuser.php', {username: username}, function(webpage)
{
if (webpage == 1)
alert("user exists");
else
alert("Username available!");
});
答案 2 :(得分:0)
再试一次:
is_user_existing('foo', function(result)
{
if (result)
alert("user is existing");
else
alert("user is not existing");
});
function is_user_existing(username, continuation)
{
$.get('uniqueuser.php', {username: username}, function(webpage)
{
continuation (webpage == 1);
});
}