0

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

任何答案将不胜感激。

此代码位于 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);

            };
        };
    }
4

1 回答 1

1

这是一种折衷方法,每个制造商都有一个信息窗口,但信息窗口不是提前创建的。相反,它们是在单击每个标记时按需创建的。

这样,就不会创建永远不会看到的 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。
于 2013-06-29T05:48:28.500 回答