2

变量“输出”没有保持其值

function send()
{
var output;
var xmlhttp;
if (window.XMLHttpRequest)
  {
  xmlhttp=new XMLHttpRequest();
  }
else
  {
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    output = xmlhttp.responseText;

此输出显示“hello world”

alert(output);
    }
  }
xmlhttp.open("GET",'mp.php',true);
xmlhttp.send();

此输出显示“未定义”:

alert(output);
return output
}

在浏览器中导航到 mp.php 的内容时显示“Hello world”

返回时如何使输出变量不是“未定义”?

4

3 回答 3

2

JavaScript 是异步的。

您的代码中发生的事情是

  1. 设置XMLHttpRequest
  2. 打印Output\\ 未定义
  3. 异步调用成功
  4. 打印Output\\"Hello World"

为了解决这个问题,在你的成功方法中,调用一个打印输出的新方法

于 2013-11-12T03:40:18.583 回答
2

Ajax 调用是异步的。你的代码流程是这样的:

xmlhttp.send(); // async, so program flow will continue
alert(output); // this happened BEFORE the ajax call returned, so it is undefined here.

更好的方法是在您的 ajax 调用完成时使用回调。回调可以对 ajax 调用返回的值做任何你需要做的事情。

在相关说明中,您可能会发现使用 jquery 更容易。您可以将其简化为

$.get('myurl',{
  success: function(res) { // do success function }
});
于 2013-11-12T03:40:56.660 回答
0

没有回报。委托 (.onreadystatechange=function()) 用完您的函数 (send())。有三种方式: a) 定义全局变量输出并使用它;b) 同步运行 xttpRequest(没有事件和事件处理);c) 更改代码结构以处理成功事件。

于 2013-11-12T03:43:34.480 回答