4

我制作标记的代码:

for (var marker in markers) {
    var posMarker = new google.maps.Marker({
        position: new google.maps.LatLng(markers[marker].lat, markers[marker].lng),
        map: map,
        visible: markers[marker].visible
    });     
};

我的标记对象:

var markers = {
        "London": {"lat": -83.68088192646843, "lng": -125.270751953125, "type": "town", "visible": false},
        "Paris": {"lat": -58.1548020417031, "lng": -21.318115234375, "type": "town", "visible": false},
};

我试图能够使用这样的复选框来切换标记:

$('#toggle').change(function() {
    for (var marker in markers) {
        posMarker.setVisible(true);
    };
}); 

但是只显示数组中的最后一个标记,如何让它们全部显示?

谢谢。

4

1 回答 1

6

好吧,我看到posMarker它被用作放置 Google Maps 标记的临时变量,并且随着 for 循环的进行,posMarker引用“更新”到放置的最新标记。这就是为什么只显示最后一个标记的原因。

您需要跟踪对放置的 Google 地图标记的所有引用,包括那些已“使用”的标记。我的方法使用一个对象,很像您的markers对象,但包含对 Google 地图标记的引用。您还可以使用普通索引数组 (posMarkers[])。由你决定。

请参阅演示,注意 LatLngs 已为简单起见进行了修改(看起来您有自定义坐标系)。

另外,我没有进行此更改,但我只是注意到调用markerin可能更有意义markers,因为您citymarkers对象的编写方式。它会更具可读性,但不会影响执行。

最后, for 循环块末尾的分号是不需要的,并且要小心对象后面的尾随逗号Paris(我猜你只是删除了列表的其余部分)。在这种情况下,这无关紧要,但有时这些尾随逗号可能是难以发现的错误的来源。

function initialize() {
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
    var markers = {
        "London": { "lat": 0, "lng": 0, "type": "town", "visible": false },
        "Paris": { "lat": 10, "lng": 10, "type": "town", "visible": false }
    };

    var posMarkers = {};

    for (var marker in markers) {
        posMarkers[marker] = new google.maps.Marker({
            position: new google.maps.LatLng(markers[marker].lat, markers[marker].lng),
            map: map,
            visible: markers[marker].visible
        });
    }

    $('#toggle').change(function () {
        for (var marker in markers) {
            if (posMarkers[marker].getVisible()) {
                posMarkers[marker].setVisible(false);
            }
            else {
                posMarkers[marker].setVisible(true);
            }
        }
    });
}
于 2012-06-30T00:05:13.333 回答