我需要访问一系列XML文档,并尝试使用for循环来动态生成每个请求:
for (i=0;i<routes.length;i++) {
routeRequestURL = "http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni&r=" + routes[i].name + "&terse";
routeRequest.open("GET", routeRequestURL);
routeRequest.send();
routeResponse = routeRequest.responseXML;
route = routeResponse.getElementsByTagName("route")[0];
for (var j = 0; j < route.childNodes.length; j++) {
if (route.childNodes[j].tagName == "stop") {
routes[i].stops.push(new Stop(route.childNodes[j].getAttribute("tag"), route.childNodes[j].getAttribute("lat"), route.childNodes[j].getAttribute("lon")));
}
}
}
routes
是route
个对象的数组,它有三个变量:name
,label
和stops
,它本身就是一个{ {1}}对象。
我在Chrome的javascript控制台中尝试了代码,当我使用stop
在外部循环中运行每一行时,它都能正常工作。当我尝试在控制台中运行循环时,收到以下错误消息:routes[0]
。
如果使用TypeError: Cannot call method 'getElementsByTagName' of null
运行每行代码都不会产生错误,那么为什么在for循环的第一次迭代期间routes[0]
为空?我在某个地方错过了关闭错误吗?
编辑:我尝试添加routeResponse
回调,但是,对javascript不熟悉,无法弄清楚如何做到这一点。我试过了:
readystatechange
它不起作用。
答案 0 :(得分:1)
两件事:
readystatechange
回调中,您必须检查回复是否已完成加载i
。以下代码应解决这两个问题:
routeRequest.onreadystatechange = (function(i) { return function() {
if(routeRequest.readyState == 4 && routeRequest.status == 200) {
routeResponse = routeRequest.responseXML;
route = routeResponse.getElementsByTagName("route")[0];
for (var j = 0; j < route.childNodes.length; j++) {
if (route.childNodes[j].tagName == "stop") {
routes[i].stops.push(new Stop(route.childNodes[j].getAttribute("tag"), route.childNodes[j].getAttribute("lat"), route.childNodes[j].getAttribute("lon")));
}
}
}
}})(i);