Ajax不会让我回归真假

时间:2013-03-28 23:36:25

标签: javascript jquery ajax

如果以下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;

}

})

3 个答案:

答案 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);
    });
}