出于某种原因,如果我返回值,我总是收到undefined
,但如果我试图在警报中显示它,我会收到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();
}
谢谢,
Guy Dor
答案 0 :(得分:5)
看起来您正在尝试从此函数中读取返回值:
function isUsernameExists() {
它没有return
语句,因此它始终为undefined
。
我猜你希望这个return语句传递你想要的值:
return xmlHttp.responseText.toString();
但这是这个功能的一部分:
xmlHttp.onreadystatechange = function() {
当readystatechange事件触发时会自动调用,而不是通过您进行的任何函数调用。
异步JavaScript和XML很少使用XML但是异步。 您要对提取的数据执行的任何操作都需要通过您分配给onreadystatechange的回调函数来完成。它可以调用其他函数,但不能返回任何内容(至少不会在任何有用的地方收到)。
答案 1 :(得分:0)
我们看不到足够的代码来完全理解这种情况,但是你正在处理一个异步操作,并且传递该异步操作结果的唯一方法是使用你从中得到的值调用一个函数操作。你不能只从函数返回。
这是一个常见的误解(我今天第六次回答这个问题)。任何代码都不会调用for ready状态更改的函数。当ajax调用完成时,浏览器会在内部调用它。这意味着从该函数返回您的值将不会做任何事情,当然也不会将该结果传达给您的任何代码。如果要将结果传递给某些代码,则需要从该函数内部调用一些代码并将其传递给所需的结果,以便代码可以对其进行操作。这打破了正常的编程流程,但在处理异步操作时是必需的。
答案 2 :(得分:0)
你在这里创建的函数中有一个return语句,
xmlHttp.onreadystatechange = function() {
但是函数中没有return语句,
function isUsernameExists() {
只是因为你在另一个函数中创建了函数并不意味着该函数中的代码会运行。
您创建的函数中的代码在服务器收到响应之前不会运行,此时创建第二个函数的原始函数已经完成执行。
代码不会停止等待来自服务器的响应,而是继续运行并完成执行。您为处理来自服务器的响应而创建的函数随后会在收到响应时运行。