点击标记时,我想在标记周围形成一个圆圈!
所以,监听器被添加到标记中,并且该功能需要在圆圈上起作用。
这是我的代码:
for(var j=0;j<lat.length;j++)
{
var pos = new google.maps.LatLng(lat[j],lng[j]);
var marker_options = {position: pos, map:map, draggable:false};
marker[j] = new google.maps.Marker(marker_options);
circle_option = {strokeColor:"#FF0000",strokeOpacity:0.8,strokeWeight:2,fillColor:"#FF0000",fillOpacity:0.35,map:null,center:pos,radius:500};
circle[j] = new google.maps.Circle(circle_option);
google.maps.event.addListener(marker[j], 'click', function() {circle[j].setMap(map);}); // Error : circle[j] is undefined
}
错误:circle [j]未定义? (在event.addListener行上!)
为什么......应该在那里定义?
如何做到这一点是正确的方法?请帮忙!!
答案 0 :(得分:10)
j
存在闭包问题。调用函数时,j
将引用j
在for循环中的最后一个值。因此,j
将lat.length
大于circle
的大小。解决方案是在生成回调函数时强制j
进行评估:
function make_callback(circle, map) {
return function() {
circle.setMap(map);
};
}
然后,在你的循环中:
google.maps.event.addListener(marker[j], 'click', make_callback(circle[j], map));
在单独的函数中包装回调生成将在您调用circle[j]
时提供make_callback
的值,而不是在调用回调时的值。
j
是对值的引用,它指向的值取决于您询问j
其值是什么时。绑定像这样的函数时:
google.maps.event.addListener(marker[j], 'click', function() { something(j); });
在调用函数之前,匿名函数不询问j
它的值是什么,函数只记得它将使用j
。当回调函数执行时,它将询问j
其当前值并使用它。这意味着两件事:
j
值。j
将为lat.length
,因为这是循环期间j
分配的最后一个值。通过使用make_callback
函数构建回调,我们在绑定回调时询问j
的值。这只是强制j
在具有我们想要的值时进行评估的标准技巧。