每当我尝试运行类似下面的内容时,firebug告诉我“标记未定义”的行为“for(var i = 0 ...”
但我在右上方将标记声明为全局变量......?
var markers;
function load() {
$.get("phpsqlajax_genxml.php", function(data) {
markers = data.documentElement.getElementsByTagName("marker");
});
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute("name")
//do more stuff
}
}
但是当我这样做时,它会起作用。
var markers; function load() { $.get("phpsqlajax_genxml.php", function(data) { markers = data.documentElement.getElementsByTagName("marker"); makeMarkersWithXMLinfo(); }); function makeMarkersWithXMLinfo() { for (var i = 0; i < markers.length; i++) { var name = markers[i].getAttribute("name") //do more stuff } } }
我甚至没有将“markers”作为参数传递给我的makeMarkersWithXMLinfo()函数。但它确实有效。这是怎么回事?日Thnx
答案 0 :(得分:5)
您遇到的问题是get
启动异步操作。因此,在get
的调用之后,您的代码会立即发生,然后才会运行get
上的成功回调。例如。 (见评论):
var markers;
function load() {
// ===> This happens FIRST
$.get("phpsqlajax_genxml.php", function(data) {
// ===> This happens THIRD, some time after `load` returns
markers = data.documentElement.getElementsByTagName("marker");
});
// ===> This happens SECOND
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getAttribute("name")
//do more stuff
}
}
您的第二个示例是对其进行编码的正确方法(尽管我建议完全避免使用全局),因为只有在GET完成后才使用markers
。
答案 1 :(得分:1)
$.get
是异步的,这意味着如果你在$.get
之后立即调用某个东西,它的回调函数就不会被调用,你的全局仍然是未定义的。