如何切换标记?

Har*_*rry 4 javascript google-maps google-maps-api-3

我制作标记的代码:

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
    });     
};
Run Code Online (Sandbox Code Playgroud)

我的标记对象:

var markers = {
        "London": {"lat": -83.68088192646843, "lng": -125.270751953125, "type": "town", "visible": false},
        "Paris": {"lat": -58.1548020417031, "lng": -21.318115234375, "type": "town", "visible": false},
};
Run Code Online (Sandbox Code Playgroud)

我试图能够用一个复选框来切换标记,如下所示:

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

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

谢谢.

Tin*_*ehr 6

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

您需要跟踪所有对Google地图标记的引用,包括那些已被"消费"的引用.我的方法使用一个对象,就像您的markers对象一样,但保留了对Google Maps标记的引用.您还可以使用普通的索引数组(posMarkers []).由你决定.

请参阅演示,注意LatLngs已经过修改以简化(看起来你有一个自定义坐标系).

另外,我没有做这种改变,但我注意到,它可能更合理调用markermarkers,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);
        }
      }
    }); 
  }
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考.演示链接不再有效. (2认同)