我想在Gmap API上实现一项功能,如果缩放超过17,则显示所有标记(否则,只需隐藏它们)。但是,当我编写如下代码时,它只是不起作用。
PS:代码在语法和排列上可能不完全正确,但它表达了我的意思
// @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)
}
});
}
}
我只是将我的代码更改为:
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));
}
}
第二个版本有效。 我知道如何使它工作,但是,我真的不知道为什么它工作,为什么另一个不工作。也许这与JS的函数闭包或参数传递原理有关(我已经检查了很多引用,但是其中一些只是持有不同的想法)。有人能给我一个帮助吗?
真的很感激。
答案 0 :(得分:0)
第一个不起作用的例子:有一个全局变量myMarker
和许多事件监听器,它们最后都在一个标记上运行,这是在循环中创建的最后一个标记。
第二个确实有效的例子:因为闭包,每个事件监听器都会收到自己的标记变量的本地副本。因此,当调用事件侦听器时,它具有正确的标记值。