代码改变世界

关于js返回值(return)输出undefine的问题

2013-08-25 20:05  杨泽川  阅读(1252)  评论(0编辑  收藏  举报

这次给公司做一个天气插件的项目,需要用ajax来返回数据,在获取数据的过程中,遇到一个蛮有意思的问题:

以下getId()是用来向服务器发送请求,获取返回id值的,然后get()是将返回值输出到文本框中。

function getId()//获得城市id
{
    var xmlhttp,id;
    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)
            {
                id=xmlhttp.responseText;
            }
      }
    var Provin=document.getElementById("s_provin").value;
    var City=document.getElementById("s_city").value;
    xmlhttp.open("POST","getCityId.asp",true);
    xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlhttp.send("Provin="+Provin+"&City="+City);
    alert(id);
    alert(id);
    return id;

}

function get()
{
    document.getElementById("ty").value=getId();
}

在getId()中,我用了两个alert(id),第一个alert(id)输出undefine,第二个alert(id)得到期望的结果。

若是在getId()中直接

document.getElementById("ty").value=xmlhttp.responseText

则不会出现undefine的结果。

这个问题主要是因为

xmlhttp.open("POST","getCityId.asp",true);

此方法参数如下:xmlhttp.open(method,url,async)

其中async可选:true(异步)或 false(同步)

若我们把上述open方法改为false,则两次alert都是我们得到的结果。