标记点击事件始终打开到最后一个推送的信息窗口

时间:2014-10-27 11:47:27

标签: javascript google-maps google-maps-api-3 infowindow marker

我有一个json对象infoCentros,用于构建地图,如下所示:

for ( var i = 0; i < infoCentros.length; i++ ) {
    var centro = infoCentros[i];
    var lat = centro.cordenadas.lat;
    var lon = centro.cordenadas.long;
    if (lat && lon) {
        c++;
        latlon = new google.maps.LatLng(lat, lon);
        var moptions = {
            position: latlon,
            map: $project.gmap
        }
        moptions.icon = theme_uri +  '/images/marker.png';
        var marker = new google.maps.Marker(moptions);
        $project.mapMarkers.push(marker);
        google.maps.event.addListener(marker, 'click', function() {
            $project.mapInfoWindow.setContent(
                '<div class="sescam-info-window">' + 
                    '<h3>' + centro.nombre + '</h3>' +
                    '<p>' + centro.lugar + '</h3>' +
                    '<p>Coordinador</p>' +
                    '<p>' + centro.coordinador.nombre + '</p>' +
                    '<p>' + centro.coordinador.email + '</p>' +
                    '<p>Responsable</p>' +
                    '<p>' + centro.responsable.nombre + '</p>' + 
                    '<p>' + centro.responsable.email + '</p>' 
                + '</div>'

            );
            $project.mapInfoWindow.open($project.gmap, marker);
        });
        $project.mapBounds.extend(latlon);
    }
}

它似乎工作正常,但如果我有5个标记,我点击哪一个并不重要,infowindow总是对应最后一个项目(位置和内容),

知道我错过了什么吗?我认为将marker传递给addListener就可以了。

2 个答案:

答案 0 :(得分:1)

问题在于google.maps.event.addListener的第三个参数。该匿名函数包含来自父作用域的变量,当使用标记单击进行评估时,该变量将始终采用指定的最后一个值。寻找关闭更多细节。但是,您可以使用&#34; bind&#34;来获得所需的行为。 javascript函数原型的功能如下:

//inside for loop   
  google.maps.event.addListener(marker, 'click', handleMarkerClick.bind(undefined, marker, i));
//other codes if any...

定义handleClick

function handleMarkerClick(marker, index) {
    if (typeof infowindow === 'undefined') {
        infowindow = new google.maps.InfoWindow({});
    }
    var data = infoCentros[index]//helpful data
    //create content with dynamic data 
    infowindow.setContent("dynamic content");
    infowindow.open(marker.getMap(), marker);//modify as per your requirement
}

答案 1 :(得分:-1)

Duncan是对的,他的意思是你必须在你的for循环之外附加监听器。它不是谷歌地图特有的,它是javascript的工作原理。尝试搜索“javascript闭包换循环”或访问此链接 - Closures in Javascript以获得简单说明。