我有一些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,然后检查代码如果相应的行为是真是假。任何帮助将不胜感激!
答案 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 false
和
ret_val=true
代替return true
然后在功能结束时return ret_val
答案 2 :(得分:0)
如果您不熟悉异步执行,首先可能会出现相当棘手的问题,但这是通过此代码进行操作的一种方法。首先,您定义的函数checkUsername()
内部没有任何return语句,因此任何尝试将某些东西设置为输出或测试它的值都将导致undefined
。 checkUsername()
里面有一个没有名字的函数(称为匿名函数或者在这种情况下是一个回调函数),它有一个return语句(实际上是两个),但是如果你注意到没有一行实际上称之为。有一个赋值,变量的名称是这个函数何时运行的唯一线索。 xmlhttp.onreadystatechange
。这告诉你的是,当Ready State
xmlhttp
更改它应该执行此功能时。现在JavaScript会执行此操作,但如果您正在阅读此功能,则可以看到就绪状态在您.send()
上调用xmlhttp
函数之后才会更改,如果您认为它将需要一些时间来完成网络请求,它实际上不会改变,直到片刻之后。有趣的是,xmlhttp
是异步的,这意味着它很乐意继续按照你告诉它要做的事情来完成它。因此,当您使用此行if(checkUsername()==true)
测试函数的返回值时,您没有测试xmlhttp
ready state
更改事件,因为它尚未发生。
现在关于你可以做些什么,干净的方法是将依赖于这个值的代码放到你的回调中。如果你想更加优雅地进入这个,你可以看看jQuery,这使得这个代码更容易推理。您很快就会使用Maybe monads并想知道为什么要阻止事件发生:)