我正在尝试设置变量result
,但它仍未定义。
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)
{
if(xmlhttp.responseText)
{
result = true
alert(xmlhttp.responseText+" here1")
}
else
{
document.getElementById("report").innerHTML = "wrong password/username"
alert(xmlhttp.responseText+" here2")
result = false
}
}
}
xmlhttp.open("POST", "process.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("name="+encodeURIComponent(name.value));
alert("final value: "+result)
return result//always undefined
如何让对象影响其所在函数之外的变量?问题比我所说的要复杂得多。当用户尝试提交表单时,将调用此函数。如果返回true,则应提交表单,但如果返回false,则不应提交表单。我现在有了代码(谢谢 sweetamylase)
var result
var checkResult = function(result) {
alert("final value: " + result);
return result
};
xmlhttp.onreadystatechange=function()
{
var result = null;
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
if(xmlhttp.responseText)
{
result = true
alert(xmlhttp.responseText+" here1")
}
else
{
document.getElementById("report").innerHTML = "wrong password/username"
alert(xmlhttp.responseText+" here2")
result = false
}
checkResult(result); // pass result to another function
}
}
xmlhttp.open("POST", "process.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("name="+encodeURIComponent(name.value));
但是,即使在显示“最终价值......”之前,表格也始终提交。如果我在代码末尾添加return false,那么表单永远不会被提交。
答案 0 :(得分:2)
AJAX是异步所以你需要修改你的onreadystatechange()
函数,你可以将result
传递给另一个函数来处理你的逻辑:
var checkResult = function(result) {
alert("final value: " + result);
/* handle your result here */
};
...
xmlhttp.onreadystatechange=function()
{
var result = null;
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
if(xmlhttp.responseText)
{
result = true
alert(xmlhttp.responseText+" here1")
}
else
{
document.getElementById("report").innerHTML = "wrong password/username"
alert(xmlhttp.responseText+" here2")
result = false
}
checkResult(result); // pass result to another function
}
}
xmlhttp.open("POST", "process.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("name="+encodeURIComponent(name.value));
答案 1 :(得分:0)
使用callback
function callServer(callback){
if (window.XMLHttpRequest)
------------------- code ------------
xmlhttp.open("POST", "process.php", true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send("name="+encodeURIComponent(name.value));
xmlhttp.onreadystatechange = function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
callback(xmlhttp.responseText);
}
}
}
}
答案 2 :(得分:0)
“onreadystatechange”函数是同步的,这就是为什么你设置一个在触发事件时执行的回调函数。 你正在做的是对javascript说:“当你改变准备状态时,请执行此操作。” 然后你的代码继续运行e返回结果的值(这是未定义的,因为就绪状态还没有改变)..
因此,如果您需要使用result的值,您应该在回调函数中执行此操作。
希望有所帮助......