我正在尝试创建一个注册页面,告诉用户他们选择的用户名是否唯一,而不重新加载页面。 php脚本'usernameAJAX.php'只是查询sql数据库,如果用户名不是唯一的,则返回“1”,如果是,则返回“0”。出于某种原因,我创建的usernameAJAX(用户名)函数没有返回任何内容,甚至第三行上的'bool'变量也没有设置为“0”。有人可以解释为什么会这样吗?
function usernameAJAX(username) {
var bool = "0";
params = "AJAXusername=" + username.value;
request = new ajaxRequest();
request.open("POST", "usernameAJAX.php", true);
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");
request.onreadystatechange = function()
{
if (this.readyState == 4)
if (this.status == 200)
if (this.responseText != null)
bool = this.responseText;
}
request.send(params);
function ajaxRequest()
{
try { var request = new XMLHttpRequest(); }
catch(e1) {
try { request = new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e2) {
try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
catch(e3) {
request = false;
} } }
return request;
}
return bool;
}
答案 0 :(得分:1)
您的功能正确,但您必须删除标题内容长度和连接。此外,您必须注意,您的函数将始终返回0.如果您想对下载的值执行某些操作,则必须在此处执行此操作:
function usernameAJAX(username, callback) {
...
if (this.responseText != null) {
bool = this.responseText;
callback(bool);
}
...
}
var show = function (bool) {
alert(bool);
};
// The execution continues in the callback function when bool is downloaded.
usernameAJAX("usuario", show);
如果您希望以传统方式返回bool值,则必须使用非异步请求,这样在下载值时窗口将被阻止,您将浪费AJAX的优势。
答案 1 :(得分:0)
AJAX调用几乎总是返回隐藏或特殊/终结符字符,使用trim命令在使用之前格式化响应,或者更好地用JSON或XML包装返回。
答案 2 :(得分:0)
实际上,usernameAJAX()
总是在请求完成之前返回。所以它的返回值总是为'0'。
更新:忘记进行实际修复。
通过更改
使请求非异步request.open("POST", "usernameAJAX.php", true);
到
request.open("POST", "usernameAJAX.php", false);
如果您希望usernameAJAX()
返回结果本身,而不是通过回调。
这样,request.send(params);
将阻止usernameAJAX()
内的执行,直到连接关闭或以错误结束。在此期间,每次request.onreadystatechange
更改时都会调用request.readyState
。
缺点是在XMLHttpRequest对象等待答案(或最终超时)的过程中,UI可能会在短时间内无响应。