var num = rez.data.length;
for(var key=0;key<num;key++)
{
var marker = [];
var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
marker[key] = new GMarker(point, {icon: iconS});
GEvent.addListener(marker[key], "click", function()
{
marker[key].openInfoWindowHtml('xxxxxx');
});
map.getMap().addOverlay(marker[key]);
}我需要帮助,谁能告诉我为什么行marker[key].openInfoWindowHtml('xxxxxx');中的marker[key]是未定义的?我在这里定义了它:marker[key] = new GMarker(point, {icon: iconS});
发布于 2009-08-19 11:10:24
除了其他答案所表明的之外,你还有另一个问题。
您的key变量的作用域位于内部事件处理函数的外部。发生的情况是,每次递增key时,都会更改事件处理程序中将使用的值。
实际上,假设num等于10。所有单击事件处理程序都将调用以下代码:
function() {
marker[10].openInfoWindowHtml('xxxxxx');
}解决这个问题的一种方法是在另一个函数中限定循环内容的范围,并立即调用它:
var num = rez.data.length;
var marker = [];
for(var key=0;key<num;key++)
{
var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
marker[key] = new GMarker(point, {icon: iconS});
function(key) {
GEvent.addListener(marker[key], "click", function() {
marker[key].openInfoWindowHtml('xxxxxx');
});
}(key);
map.getMap().addOverlay(marker[key]);
}编辑:澄清。我所做的就是声明一个匿名函数,然后立即调用它。更清楚地看到正在发生的事情的另一种方法是
function(key) {
GEvent.addListener(marker[key], "click", function() {
marker[key].openInfoWindowHtml('xxxxxx');
});
}(key);可以替换为:
function temp(key) {
GEvent.addListener(marker[key], "click", function() {
marker[key].openInfoWindowHtml('xxxxxx');
});
};
temp(key);也就是说,首先声明一个名为temp的临时函数,然后在后面的行调用它。
发布于 2009-08-19 11:06:54
您应该在进入该循环之前定义标记数组...
var num = rez.data.length;
var marker = [];
for(var key=0;key<num;key++)
{
var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
marker[key] = new GMarker(point, {icon: iconS});
GEvent.addListener(marker[key], "click", function()
{
marker[key].openInfoWindowHtml('xxxxxx');
});
map.getMap().addOverlay(marker[key]);
}...otherwise它将在每次循环运行时被重置,并且在索引num - 1处数组中将只有一个标记。
发布于 2009-08-19 11:17:24
可以从闭包访问key -所有侦听器函数都将共享相同的key。在for循环结束后,key应该等于num,显然marker[num]应该是undefined。您可以在处理程序中使用alert(key)验证这一点。
您希望在定义侦听器函数时使用特定的键。您可以通过在输入稳定的上下文中创建侦听器函数来完成此操作,例如:
function createListener(marker) {
return function() {
marker.openInfoWindowHtml('xxxxxx');
};
}
var num = rez.data.length;
var markers = [];
for(var key=0;key<num;key++)
{
var point = new GLatLng(rez.data[key].latitude, rez.data[key].longitude);
var marker = new GMarker(point, {icon: iconS});
markers[key] = marker;
GEvent.addListener(marker, "click", createListener(marker));
map.getMap().addOverlay(marker);
}https://stackoverflow.com/questions/1299155
复制相似问题