Javascript 使用回调函数在google地图上放置多个标记
我想在GMAPAPI上实现一个功能,如果缩放超过17,则显示所有标记(否则,只需隐藏它们)。然而,当我编写下面这样的代码时,它就是不起作用 PS:代码的语法和排列可能不完全正确,但它表达了我的意思Javascript 使用回调函数在google地图上放置多个标记,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我想在GMAPAPI上实现一个功能,如果缩放超过17,则显示所有标记(否则,只需隐藏它们)。然而,当我编写下面这样的代码时,它就是不起作用 PS:代码的语法和排列可能不完全正确,但它表达了我的意思 // @latlong is an array of tuple (latitude , longtitude) // @myMap is the google map object passed to the function function placeMarker( myMap , latlon
// @latlong is an array of tuple (latitude , longtitude)
// @myMap is the google map object passed to the function
function placeMarker( myMap , latlon)
{
for(var i = 0 ; i < latlon.length ; i ++)
{
myMarker = new google.maps.Marker( {
position: new google.maps.LatLng(latlon[i][0], latlon[i][1])
});
google.maps.event.addListener(myMap, 'zoom_changed', function() {
zoomLevel = myMap.getZoom()
if(zoomLevel >= 17)
{
myMarker.setMap(myMap)
}
else
{
myMarker.setMap(null)
}
});
}
}
/@latlong是一个元组数组(纬度、长度)
//@myMap是传递给函数的google map对象
功能位置标记(myMap,latlon)
{
对于(变量i=0;i=17)
{
myMarker.setMap(myMap)
}
其他的
{
myMarker.setMap(空)
}
});
}
}
我只需将代码更改为:
function placeMarker( myMap , latlon)
{
for(var i = 0 ; i < latlon.length ; i ++)
{
myMarker = new google.maps.Marker( {
position: new google.maps.LatLng(latlon[i][0], latlon[i][1])
});
(function(myMarker_copy){
google.maps.event.addListener(myMap, 'zoom_changed', function() {
zoomLevel = myMap.getZoom()
if(zoomLevel >= 17)
{
myMarker_copy.setMap(myMap)
}
else
{
myMarker_copy.setMap(null)
}
});
}(myMarker));
}
}
函数placeMarker(myMap,latlon)
{
对于(变量i=0;i=17)
{
myMarker_copy.setMap(myMap)
}
其他的
{
myMarker_copy.setMap(空)
}
});
}(我的标记);
}
}
第二个版本可以工作。
我知道如何使它工作,但是,我真的不知道为什么它工作,为什么其他没有。也许这与JS的函数闭包或参数传递原理有关(我查阅了很多参考文献,但其中一些只是持有不同的观点)。谁能帮我一个忙吗
非常感谢。第一个不起作用的示例:有一个全局变量
myMarker
和许多事件侦听器,它们最终都对一个标记进行操作,而这个标记是在循环中最后创建的
第二个确实有效的示例:由于闭包,每个事件侦听器都会接收自己的标记变量的本地副本。因此,当调用事件侦听器时,它具有正确的标记值。如果latlon变量是一个元组数组,那么latlon[0]和latlon[1]都是元组。您需要向标记构造函数传递元组值,而不是元组本身。position:
position:new google.maps.LatLng(latlon[i][0],latlon[i][1])
是的,这是一个打字错误,我已经修改了,是的,但我认为JS会通过引用而不是深度复制传递myMarkder变量……所以如果你说这是因为函数的关闭,那么参数myMarker_copy仍然应该指向同一个对象,我认为这是因为函数参数是按值传递的。即使对于对象,它们似乎是通过引用传递的。但它们仍然是通过值传递的。内部函数(在本例中为事件处理程序)可以访问在其中定义的函数的参数和变量(函数可以访问创建它的上下文)。事件处理函数绑定到传入的对象,而不是在封闭函数外部定义的对象。好吧~仍然有点混淆js函数参数的传递…但是无论如何,你帮了很多忙