我正在编写一个小型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,如果有帮助的话。
答案 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生成的呼叫之间是否存在差异。