XMLHttpRequest什么都没有返回?

时间:2012-03-27 16:11:44

标签: javascript xmlhttprequest

我正在编写一个小型JavaScript程序,可以通过网络调用来提取用户点击地图时的天气信息。这是我的代码:

    //get the three letter airport code
    var text = kmlEvent.featureData.name;

    //service to get woeid
    var woeid_url = 'http://where.yahooapis.com/geocode?name=';
    xmlhttp = new XMLHttpRequest();
    //has to be sync, since next request depends on it
    xmlhttp.open('POST', woeid_url + text, false);
    xmlhttp.send(null);
    //now we get the relevent info from the XML
    xmlDoc = xmlhttp.responseXML;
    woeid_xml = xmlDoc.getElementsByTagName('woeid');
    //parse the xml and get the woeid
    woeid = woeid_xml[0].childNodes[0].nodeValue;

    //with the woeid found, we can make the weather request
    weatherhttp = new XMLHttpRequest();
    var weather_url = 'http://weather.yahooapis.com/forecastrss?w=' + woeid + '&u=f';
    //this is async
    weatherhttp.open('POST', weather_url, true);
    weatherhttp.onreadystatechange = function() {
        if (weatherhttp.readyState == 4) {
        alert(weatherhttp.status);
        }
    }
    weatherhttp.send(null);

它调用Yahoo来获取用户点击位置的数据。这是有效的,我得到了祸好。但是,当我第二次调用天气服务时,它返回任何内容,并返回0作为状态代码。

如果我将第二部分更改为同步而不是异步,我仍然会得到相同的错误。有谁看到我做错了什么?如果我将weather_url复制到我的浏览器中,请加载它就好了。我不明白为什么第一部分有效,但不是第二部分。我是JavaScript和AJAX的新手,所以我真的不知道我在做什么。

我使用的浏览器是FireFox,如果有帮助的话。

2 个答案:

答案 0 :(得分:1)

我强烈建议使用像Prototype或JQuery这样的框架,因为你说你是JS的新手,特别是涉及到AJAX时。他们都会为你做好准备并简化事情。

我对您缺少数据的猜测是您要求尝试从其他域加载数据 - 请参阅Same Origin Policy。测试在您的域中加载某些内容,看看这是否确实是问题。

远离同步AJAX调用!理想情况下,一旦收到数据,通常在回调中,你就会做依赖于第一个请求响应的事情。同样,框架可以让您轻松完成:Check out the 'onSuccess' here

答案 1 :(得分:0)

尝试使用GET代替POST作为您的方法。每the documentation

  

PlaceFinder Web服务仅支持HTTP GET方法。不支持其他HTTP方法。

您还可以使用代理嗅探器(如Fiddler)来比较呼叫,以查看在浏览器中手动进行的成功呼叫与通过AJAX生成的呼叫之间是否存在差异。