由于某种原因,如果我返回值,我总是收到undefined
,但如果我试图在alert中显示它,我接收php值。
function getXMLHttp() {
var xmlHttp
try {
//Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
} catch(e) {
//Internet Explorer
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
//Browser does not support AJAX
return false;
}
}
}
return xmlHttp;
}
function isUsernameExists() {
var xmlHttp = getXMLHttp();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
handleResponse(xmlHttp.responseText);
}
}
var str = document.getElementById('username').value.toString();
xmlHttp.open("GET", "ajax.php?username="+str, true);
xmlHttp.send(null);
}
编辑:
function handleResponse(response) {
return response.toString();
}
谢谢,
家伙金龟子
看起来您正在尝试从这个函数读取返回值:
function isUsernameExists() {
没有return
语句,所以它总是undefined
。
我猜你希望这个返回语句传递你想要的值:
return xmlHttp.responseText.toString();
但这是这个函数的一部分:
xmlHttp.onreadystatechange = function() {
在readystatechange事件触发时自动调用,而不是由任何函数调用。
异步JavaScript和XML很少使用XML,但是是异步的。任何你想对获取的数据做的事情都需要通过你分配给onreadystatechange的回调函数来完成。它可以调用其他函数,但它不能返回任何东西(至少不能在任何有用的地方接收)。
我们不能看到足够的代码来完全理解这种情况,但是你正在处理一个异步操作,并且传递异步操作结果的唯一方法是使用从该操作获得的值调用函数。你不能只从函数返回。
这是一个常见的误解(我今天第六次回答这个问题了)。您的任何代码都不会调用用于就绪状态更改的函数。它在ajax调用完成时由浏览器内部调用。这意味着从该函数返回值不会做任何事情,当然也不会将结果传递给任何代码。如果您希望将该结果传递给某些代码,则需要从该函数内部调用某些代码,并将期望的结果传递给它,以便代码可以对其进行操作。这打破了正常的编程流程,但在处理异步操作时是必需的。
你在这里创建的函数中有一个返回语句
xmlHttp.onreadystatechange = function() {
但是函数中没有返回语句,
function isUsernameExists() {
仅仅因为你在另一个函数中创建了一个函数,并不意味着该函数中的代码可以运行。
您创建的函数中的代码将不会运行,直到从服务器接收到响应,此时创建第二个函数的原始函数将已经完成执行。
代码不会停止等待服务器的响应,而是继续运行并完成执行。您创建的用于处理来自服务器的响应的函数将在稍后收到响应时运行。