0

I've got some javascript that checks over an html form for whatever issues there are that need to be corrected. However, the part that makes an ajax request back to a php script to check the database for presence of username doesn't work.
The php script queries the database and echoes back either "true" or "false". The javascript function with the ajax request looks like this:

function checkUsername()
{
var username = document.getElementById("d_username");
var usernameValue = username.value;
var 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)
    {
    result=xmlhttp.responseText;
    if(result.trim() === "true"){
    return true;    
    }else if(result.trim() === "false"){
    return false;
    }
    }
}
xmlhttp.open("GET","scripts/checkUsername.php?username="+usernameValue,true);
xmlhttp.send();
}

The function that calls this calls a few other functions and does several checks on it's own. However, the part that call this function looks like this:

var check = checkUsername();
if(check===true){
messageText=messageText+"- Username already exists in system.<br />";
status = "fail";
}

However, I was originally using the function name right in the if statement like:

    if(checkUsername()==true)

and if(checkUsername()=="true") plus many variations of ==s, ===s, ''s, ""s, all about the checkUsername() function and where it's called.

Could somebody please help me with why this isn't working.. I just want the function to be able to see if the php script returns true or false and then report either true or false respectively, then for the code that checks if it's true or false to act accordingly. Any help would be greatly appreciated!

4

3 回答 3

0

问题是您正在执行的 AJAX 调用是异步的,因此您的函数将在调用完成之前退出并返回undefined

尝试:

xmlhttp.open("GET","scripts/checkUsername.php?username="+usernameValue, false);

反而

xmlhttp.open("GET","scripts/checkUsername.php?username="+usernameValue, true);

使呼叫同步。

此外,您必须在内部设置一个值onreadystatechange并在您的函数中返回该值。

IE

var ret_val;

onreadystatechange :ret_val=false取而代之return false_ ret_val=truereturn true

然后return ret_val在你的函数结束时

于 2013-09-16T22:05:43.217 回答
0

假设您的代码没有抛出错误,您必须考虑到 Javascript 会发出请求并继续执行代码。当响应返回时,它将跳回并按照您的指示处理响应。

尝试这个:

if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
    result=xmlhttp.responseText;
    if(result.trim() === "true"){
        alert(1);    
    }else if(result.trim() === "false"){
        alert(0); 
    }
}

您将能够查看代码是否正常运行,并在出现错误时调试您的 PHP 文件。您需要做的下一件事是包含代码以messageText全局更改或其他变量或使用回调函数以显示更改。

于 2013-09-16T21:57:19.727 回答
0

如果您不熟悉异步执行,这可能看起来相当棘手,但这里有一种方法可以浏览此代码。首先,您定义调用的函数checkUsername()内部没有任何 return 语句,因此任何对其输出设置某些内容或测试其值的尝试将始终导致undefined. 里面checkUsername()有一个没有名称的函数(称为匿名函数,在这种情况下称为回调),并且它有一个 return 语句(实际上是两个),但是如果您注意到实际上没有调用它的行。有一个赋值,变量的名称是这个函数何时运行的唯一线索。xmlhttp.onreadystatechange. 这告诉你的是,Ready Statexmlhttp更改它应该执行此功能。现在 JavaScript 会执行此操作,但如果您正在阅读此函数,您可以看到在您调用.send()函数 on之前就绪状态不会改变xmlhttp,并且如果您认为网络请求需要一些时间才能完成,它实际上在片刻之后才会改变。有趣的是,它xmlhttp是异步的,这意味着它会在生成它的代码完成后愉快地继续做你告诉它做的事情。因此,当您使用这一行测试函数的返回值时,您if(checkUsername()==true)并没有测试xmlhttp ready state更改事件,因为它还没有发生。

现在至于你能做些什么,干净的方法是将依赖于这个值的代码放在你的回调中。如果你想更优雅地进入这一点,你可以看看 jQuery,它使这段代码更容易推理。您很快就会使用Maybe monads并想知道为什么要阻止事件 :)

于 2013-09-16T22:10:02.643 回答