【问题标题】:Ajax wont let me return true or falseAjax 不会让我返回 true 或 false
【发布时间】:2013-03-28 23:36:24
【问题描述】:

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

}

})

【问题讨论】:

  • 搜索“ajax 返回值” asynchronous 位特别重要..另外,考虑使用 AJAX 库(不,我不在乎哪个, 但是由于 你把它标记为 jQuery..)
  • stackoverflow.com/questions/5316697/… - jQuery,但应该显示要点(以及如何编写更简洁的代码)以及如果您想要 同步 行为(糟糕!)请参阅stackoverflow.com/questions/2942544/…跨度>
  • 我尝试使用 jquery 版本,但也没有用
  • 这是我所获得的最接近的,而且,我仍然不确定我应该看什么
  • 如果使用非匿名函数作为第二个参数的validator.registerCallback 会怎样? (你在那儿给出一个函数名)。那是一个你可以从任何地方调用的函数。其中包括已检索网页的处理程序(在我的 jQuery 解决方案中)。

标签: javascript jquery ajax


【解决方案1】:

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

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

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

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

您还需要更改其余代码,例如,请参阅this MDN article

【讨论】:

  • 如何让它同步?
  • 我查了一下,但我找不到在我的代码中放置 async = false 的位置
【解决方案2】:

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

var username = "foo";
$.get('uniqueuser.php', {username: username}, function(webpage)
{
  if (webpage == 1)
    alert("user exists");
  else
    alert("Username available!");
});

【讨论】:

  • validator.registerCallback('unique_username', function(value) { var username = value; $.get('uniqueuser.php', {username: username}, function(webpage) { if (webpage == 1) { alert("Username Available!"); return true; } else { alert("Username Exists"); return false; } }); }) 当我这样做时,我得到了正确的警报,但它没有返回函数 true 或 false
  • 我想为验证器中的函数function(value)返回真或假
  • 啊,也许你需要把我写的代码放在一个带两个参数的函数中,函数is_user_existing(username, continuation),continuation是一个函数对象,它的结果会被调用阿贾克斯调用。然后你使用 is_user_existing('foo', function(result) { /* do someting */ });结果是真或假。
【解决方案3】:

再试一次:

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

【讨论】:

  • is_user_existing没有普通返回值的原因是函数在ajax调用没有结果之前就返回了
  • 我不知道如何解决这个问题...我用我尝试过的方法编辑了你的答案,但没有用
  • 我还在尝试返回真假给validator.registerCallback('unique_username', function(value)
  • function(value) 只是没有得到它
  • 它是表单验证脚本的一部分...我需要它,因为如果它返回 false,它不会让用户提交表单
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2012-11-11
  • 2011-01-17
  • 2013-06-29
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多