首页 > 解决方案 > panTo() 方法干扰 Google Maps Javascript API 中的弹跳动画

问题描述

我正在实现一个相对简单的谷歌地图,其中有各种标记。我正在向标记添加一个侦听器,以便在单击时它会上下弹跳,并且地图会平移到它。

预期的行为是您单击一个引脚并弹跳,再次单击它并停止。此外,如果您单击一个大头针,然后单击另一个大头针,第一个停止弹跳,第二个开始。很直观。

然而,发生的事情是它在引脚之间“来回”两三个后停止工作。我已经缩小了地图平移到图钉 (panTo()) 的行为的罪魁祸首。如果我删除它,它工作得很好。

附加的代码重现了该问题。如果您使用 panTo() 方法注释该行,您可以看到它是如何正常工作的。

关于为什么会发生这种情况以及如何解决它的任何想法?

<!DOCTYPE html>
<html>
  <head>
    <title>Simple Map</title>
    <script src="https://polyfill.io/v3/polyfill.min.js?features=default"></script>
    <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap&libraries=&v=weekly"
      defer
    ></script>
    <style type="text/css">
      #map {
        height: 100%;
      }
      html,
      body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
    <script>
    let map;
    markers = [];

    positions = [
        {lat : 50.46818409999999, lng: 30.5252753},
        {lat : 50.46220959999999, lng: 30.5153674},
    ];

    function initMap() {
        map = new google.maps.Map(document.getElementById("map"), {
          center: { lat: 50.462, lng: 30.514 },
          zoom: 12,
        });
        dropmarkers();
    };

    function dropmarkers() {
        
        for (let i = 0; i < positions.length; i++) {

            window.setTimeout(() => {

                var marker = new google.maps.Marker({
                    position: {lat: positions[i]['lat'], lng: positions[i]['lng']},
                    animation: google.maps.Animation.DROP
                });

                markers.push(marker);

                marker.addListener("click", function () {
                    toggleAnimation(marker);
                    map.panTo({lat: positions[i]['lat'], lng: positions[i]['lng']});
                    map.setZoom(14);
                });

                marker.setMap(map);

            }, i * 200);
        };
    };

    function toggleAnimation(marker) {
        if (marker.getAnimation() !== null) {
            marker.setAnimation(null);
        } else {
            for (var j = 0; j < markers.length; j++) {
                markers[j].setAnimation(null);
            }
            marker.setAnimation(google.maps.Animation.BOUNCE);
        };
    };

    </script>
  </head>
  <body>
    <div id="map"></div>
  </body>
</html>

标签: javascriptgoogle-maps

解决方案


推荐阅读