使用多标记与多信息窗口

时间:2013-06-29 04:14:43

标签: google-maps google-maps-api-3 javascript-events google-maps-markers infowindow

我有一组与标记数组相对应的信息窗口。 现在,我有一个问题,我使用下面的代码生成一个信息窗口,当点击标记时,所有标记都消失,除非一个,当我点击该标记时,没有信息窗口出来。 我的代码有什么问题?或者我该怎么办?

任何答案都将非常感谢,提前致谢。

此代码位于for循环中:

infoWindoArray[i][j] = new google.maps.InfoWindow({
                      content:"Lat: "+this.position.lat() + "\nLng: " + this.position.lng() + "\n"+ this.customInfo,
                });

                google.maps.event.addListener(AllMarkers[i][j], 'click', (function(x) {
                    return function() {infoWindoArray[i][j].open(map,AllMarkers[i][j]);}
                })(x));

编辑:我添加整个for循环更清晰:

        for (var i = 0; i < ArrayOfAllFilesData.length-1; i++) {//to select certain file.
            var myarr = ArrayOfAllFilesData[i+1];

            AllMarkers[i] = new Array();
            for (var j=0; j < myarr.length; j++) {
                var marker_center = new google.maps.LatLng(myarr[j][0],myarr[j][1]);

                AllMarkers[i][j] = new google.maps.Marker({
                    position: marker_center,
                    customInfo: "Number of encounters: "+myarr[j][2],
                    title:'Click to zoom',
                    visible:true,
                });
                AllMarkers[i][j].setMap(map);

            };
        };
    }

1 个答案:

答案 0 :(得分:1)

这是一种折衷的方法,每个制造商有一个infoWindow,但infowindows不是事先创建的。相反,它们是按需创建的,因为每个标记都被点击。

这样,就不会创建永远不会看到的infoWindows。一旦创建,每个infoWindow将在用户重新访问其标记时重复使用。

在嵌套的i / j循环之外:

var AllMarkers = [];//Not necessary unless used elsewhere

function clickMarker_closure(arr) {
    return function() {
        if(!this.infoWin) {
            this.infoWin = new google.maps.InfoWindow({
                content: [
                    "Lat: " + this.position.lat(),
                    "Lng: " + this.position.lng(),
                    "Number of encounters: " + arr[2]
                ].join("\n")
            });
        }
        this.infoWin.open(map, this);
    };
}

嵌套的i / j循环:

for (var i=0; i<ArrayOfAllFilesData.length-1; i++) {//to select certain file.
    var myarr = ArrayOfAllFilesData[i+1],
        marker;
    AllMarkers[i] = [];//necessary?
    for (var j=0; j < myarr.length; j++) {
        marker = new google.maps.Marker({
            map: map,
            position: new google.maps.LatLng(myarr[j][0], myarr[j][1]),
            title: 'Click to zoom',
            visible: true,
        });
        AllMarkers[i][j] = marker;//necessary?
        google.maps.event.addListener(marker, 'click', clickMarker_closure(myarr[j]));
    }
}

用户将不知道infoWindows是按需创建的。

修改1

  • 上面编辑,更好地了解了i / j循环的结构,并简化了闭包对其数据和标记的引用。
  • 不再需要infoWindoArray。