0

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

})

所以基本上,我可以告诉它在主函数中返回 true,但是当我试图让它返回 true 时,只有当 ajax 脚本中的值不返回 1 时,它才会起作用。顺便说一句,警报确实有效。所以它得到了正确的值,但它不会返回真或假。

任何帮助表示赞赏!

更新

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;

}

})
4

3 回答 3

1

您缺少的是 ajax 调用是异步的。当你的函数结束时,ajax 调用还没有完成,值(true 或 false)只会在稍后返回。

要解决这个问题,您需要使 ajax 调用同步或修改链接逻辑,例如反转它并在 ajax 调用中运行 validator.registerCallback()。您还可以考虑一些更复杂的技术,例如promises

[更新]这是使请求同步的方式:

xmlhttp.open("GET","uniqueuser.php?username="+value,false);

您还需要更改其余代码,例如,请参阅此 MDN 文章

于 2013-03-29T00:05:14.393 回答
0

您已将 jQuery 添加到此问题的关键字列表中,因此我使用 jQuery 回答:

var username = "foo";
$.get('uniqueuser.php', {username: username}, function(webpage)
{
  if (webpage == 1)
    alert("user exists");
  else
    alert("Username available!");
});
于 2013-03-28T23:53:58.037 回答
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);
    });
}
于 2013-03-29T00:11:54.773 回答