如何检查ajax响应的文本

时间:2013-09-16 21:51:02

标签: javascript php ajax

我有一些javascript可以检查html表单中是否存在需要纠正的问题。但是,将ajax请求返回到php脚本以检查数据库是否存在用户名的部分不起作用 php脚本查询数据库并回显“true”或“false”。 带有ajax请求的javascript函数如下所示:

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

调用它的函数会调用其他一些函数,并对它自己进行多次检查。但是,调用此函数的部分如下所示:

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

但是,我最初在if语句中使用了函数名称,如:

    if(checkUsername()==true)

和         如果(checkUsername()== “真”) 加上== s,=== s,'s,“”的许多变体,所有关于checkUsername()函数及其调用的位置。

有人可以帮我解释为什么这不起作用..我只是希望函数能够看到php脚本是返回true还是false然后分别报告true或false,然后检查代码如果相应的行为是真是假。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分: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或其他变量,或者使用回调函数来更改显示。

答案 1 :(得分:0)

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

尝试:

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

代替

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

使呼叫同步。

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

var ret_val;

的onreadystatechange: ret_val=false代替return falseret_val=true代替return true

然后在功能结束时return ret_val

答案 2 :(得分:0)

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

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