javascript - Google Maps API v3 : Passing values to Listener function(), 以便在单击标记时形成一个圆圈?

标签 javascript google-maps google-maps-api-3 dom-events

我想在点击标记时在标记周围形成一个圆圈!

因此,Listener 被添加到marker 中,函数需要作用于圆圈。

这是我的代码:

   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 行!)

为什么..应该在那里定义它?

怎么做才是正确的方法?请帮忙!

最佳答案

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));

将回调生成包装在一个单独的函数中将在您调用 make_callback 时立即为您提供 circle[j] 的值,而不是回调时的值打电话。

j 是对一个值的引用,它指向的值取决于你何时询问 j 它的值是什么。当你像这样绑定(bind)一个函数时:

google.maps.event.addListener(marker[j], 'click', function() { something(j); });

匿名函数在函数被调用之前不会询问j 它的值是什么,函数只是记住它要使用j。当回调函数执行时,它会向 j 询问它的当前值并使用它。这意味着两件事:

  • 您在该循环中绑定(bind)的所有回调都将使用相同的 j 值。
  • j 将是 lat.length,因为这是 j 在循环期间分配的最后一个值。

通过使用 make_callback 函数构建回调,我们在绑定(bind)回调时向 j 询问它的值。这只是强制 j 在具有我们想要的值时进行计算的标准技巧。

关于javascript - Google Maps API v3 : Passing values to Listener function(), 以便在单击标记时形成一个圆圈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5838868/

相关文章:

javascript - 刷新页面后灰色框而不是谷歌地图

javascript - 使用 google map js api v3 为路线制作动画

google-maps - map 空闲事件的监听器不适用于 Google map API v3.28.18

javascript - 多语言 React DatePicker

javascript - fb.api 在连接的用户上返回 'undefined'

javascript - 计算数组中对象中两个键的出现次数

javascript - Google Map v3 marker点击功能问题和触发外链

javascript - ckeditor 将无法正确打开代码片段

javascript - Google map API V3 响应语言的城市名称错误

javascript - Google Maps API 放大特定区域